by: Kaegan Casey, Patrick Durkin, Mengchao Li, Yongbo Shu, Yiwei Yan

Import libraries and read in data

library(ggplot2)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
library(plyr)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:plyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(quantmod)
Loading required package: xts
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric

Registered S3 method overwritten by 'xts':
  method     from
  as.zoo.xts zoo 

Attaching package: ‘xts’

The following objects are masked from ‘package:dplyr’:

    first, last

Loading required package: TTR
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
Version 0.4-0 included new data defaults. See ?getSymbols.
library(scales)
library(rlist)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(tidyverse)
── Attaching packages ──────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ tibble  2.1.3     ✔ purrr   0.3.2
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ─────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::arrange()    masks plyr::arrange()
✖ readr::col_factor() masks scales::col_factor()
✖ purrr::compact()    masks plyr::compact()
✖ dplyr::count()      masks plyr::count()
✖ purrr::discard()    masks scales::discard()
✖ dplyr::failwith()   masks plyr::failwith()
✖ dplyr::filter()     masks stats::filter()
✖ xts::first()        masks dplyr::first()
✖ dplyr::id()         masks plyr::id()
✖ dplyr::lag()        masks stats::lag()
✖ xts::last()         masks dplyr::last()
✖ dplyr::mutate()     masks plyr::mutate()
✖ dplyr::rename()     masks plyr::rename()
✖ dplyr::summarise()  masks plyr::summarise()
✖ dplyr::summarize()  masks plyr::summarize()
library(transformr)
library(gganimate)
library(xtable)

options(stringsAsFactors = FALSE, scipen=99999)

# weatherFull just needs to be in the same folder as this notebook .rmb file
full <- read.csv('weatherFull.csv')

Descriptive Statistics

head(full)
dim(full)
[1] 1572907      52
summary(full[,1:26])
       X           BEGIN_YEARMONTH    BEGIN_DAY       BEGIN_TIME   END_YEARMONTH       END_DAY     
 Min.   :      1   Min.   :195001   Min.   : 1.00   Min.   :   0   Min.   :195001   Min.   : 1.00  
 1st Qu.: 393228   1st Qu.:199905   1st Qu.: 7.00   1st Qu.: 900   1st Qu.:199905   1st Qu.: 8.00  
 Median : 786454   Median :200612   Median :15.00   Median :1515   Median :200612   Median :16.00  
 Mean   : 786454   Mean   :200422   Mean   :15.02   Mean   :1324   Mean   :200422   Mean   :16.35  
 3rd Qu.:1179680   3rd Qu.:201212   3rd Qu.:23.00   3rd Qu.:1820   3rd Qu.:201212   3rd Qu.:24.00  
 Max.   :1572907   Max.   :201906   Max.   :31.00   Max.   :2359   Max.   :201906   Max.   :31.00  
                                                                                                   
    END_TIME      EPISODE_ID           EVENT_ID            STATE             STATE_FIPS        YEAR     
 Min.   :   0   Min.   :        1   Min.   :        3   Length:1572907     Min.   : 1.0   Min.   :1950  
 1st Qu.:1200   1st Qu.:    59043   1st Qu.:   415503   Class :character   1st Qu.:19.0   1st Qu.:1999  
 Median :1613   Median :   117466   Median :   831695   Mode  :character   Median :30.0   Median :2006  
 Mean   :1483   Mean   :   637232   Mean   :  3603266                      Mean   :31.7   Mean   :2004  
 3rd Qu.:1909   3rd Qu.:  1163492   3rd Qu.:  5562408                      3rd Qu.:45.0   3rd Qu.:2012  
 Max.   :2359   Max.   :990000001   Max.   :990000003                      Max.   :99.0   Max.   :2019  
                NA's   :232239                                             NA's   :1                    
  MONTH_NAME         EVENT_TYPE          CZ_TYPE             CZ_FIPS        CZ_NAME         
 Length:1572907     Length:1572907     Length:1572907     Min.   :  0.0   Length:1572907    
 Class :character   Class :character   Class :character   1st Qu.: 25.0   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Median : 65.0   Mode  :character  
                                                          Mean   : 94.2                     
                                                          3rd Qu.:117.0                     
                                                          Max.   :876.0                     
                                                                                            
     WFO            BEGIN_DATE_TIME    CZ_TIMEZONE        END_DATE_TIME      INJURIES_DIRECT    
 Length:1572907     Length:1572907     Length:1572907     Length:1572907     Min.   :   0.0000  
 Class :character   Class :character   Class :character   Class :character   1st Qu.:   0.0000  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :   0.0000  
                                                                             Mean   :   0.0967  
                                                                             3rd Qu.:   0.0000  
                                                                             Max.   :1700.0000  
                                                                                                
 INJURIES_INDIRECT   DEATHS_DIRECT      DEATHS_INDIRECT    DAMAGE_PROPERTY   
 Min.   :   0.0000   Min.   :  0.0000   Min.   : 0.00000   Length:1572907    
 1st Qu.:   0.0000   1st Qu.:  0.0000   1st Qu.: 0.00000   Class :character  
 Median :   0.0000   Median :  0.0000   Median : 0.00000   Mode  :character  
 Mean   :   0.0084   Mean   :  0.0116   Mean   : 0.00161                     
 3rd Qu.:   0.0000   3rd Qu.:  0.0000   3rd Qu.: 0.00000                     
 Max.   :2400.0000   Max.   :638.0000   Max.   :20.00000                     
                                                                             
summary(full[,27:52])
 DAMAGE_CROPS          SOURCE            MAGNITUDE       MAGNITUDE_TYPE     FLOOD_CAUSE       
 Length:1572907     Length:1572907     Min.   :    0.0   Length:1572907     Length:1572907    
 Class :character   Class :character   1st Qu.:    0.9   Class :character   Class :character  
 Mode  :character   Mode  :character   Median :    1.8   Mode  :character   Mode  :character  
                                       Mean   :   25.5                                        
                                       3rd Qu.:   52.0                                        
                                       Max.   :22000.0                                        
                                       NA's   :653424                                         
    CATEGORY       TOR_F_SCALE          TOR_LENGTH        TOR_WIDTH       TOR_OTHER_WFO     
 Min.   :1.0       Length:1572907     Min.   :   0.0    Min.   :   0.0    Length:1572907    
 1st Qu.:1.0       Class :character   1st Qu.:   0.0    1st Qu.:   0.0    Class :character  
 Median :1.0       Mode  :character   Median :   0.0    Median :   0.0    Mode  :character  
 Mean   :1.4                          Mean   :   0.9    Mean   :  32.3                      
 3rd Qu.:1.0                          3rd Qu.:   0.0    3rd Qu.:  10.0                      
 Max.   :5.0                          Max.   :2315.0    Max.   :5280.0                      
 NA's   :1572581                      NA's   :1307840   NA's   :1307840                     
 TOR_OTHER_CZ_STATE TOR_OTHER_CZ_FIPS TOR_OTHER_CZ_NAME   BEGIN_RANGE     BEGIN_AZIMUTH     
 Length:1572907     Min.   :  1.0     Length:1572907     Min.   :   0.0   Length:1572907    
 Class :character   1st Qu.: 47.0     Class :character   1st Qu.:   0.0   Class :character  
 Mode  :character   Median : 93.0     Mode  :character   Median :   1.0   Mode  :character  
                    Mean   :104.6                        Mean   :   2.4                     
                    3rd Qu.:139.0                        3rd Qu.:   3.0                     
                    Max.   :810.0                        Max.   :3749.0                     
                    NA's   :1570665                      NA's   :716340                     
 BEGIN_LOCATION       END_RANGE      END_AZIMUTH        END_LOCATION         BEGIN_LAT     
 Length:1572907     Min.   :  0.0    Length:1572907     Length:1572907     Min.   :-14.4   
 Class :character   1st Qu.:  0.0    Class :character   Class :character   1st Qu.: 34.4   
 Mode  :character   Median :  1.0    Mode  :character   Mode  :character   Median : 38.0   
                    Mean   :  2.3                                          Mean   : 37.8   
                    3rd Qu.:  3.0                                          3rd Qu.: 41.3   
                    Max.   :925.0                                          Max.   : 70.5   
                    NA's   :716717                                         NA's   :599776  
   BEGIN_LON         END_LAT          END_LON       EPISODE_NARRATIVE  EVENT_NARRATIVE   
 Min.   :-171.0   Min.   :-14.5    Min.   :-815.1   Length:1572907     Length:1572907    
 1st Qu.: -97.5   1st Qu.: 34.6    1st Qu.: -97.5   Class :character   Class :character  
 Median : -91.4   Median : 38.0    Median : -91.0   Mode  :character   Mode  :character  
 Mean   : -91.0   Mean   : 37.9    Mean   : -92.6                                        
 3rd Qu.: -83.5   3rd Qu.: 41.3    3rd Qu.: -83.2                                        
 Max.   : 171.4   Max.   : 70.4    Max.   : 171.4                                        
 NA's   :599776   NA's   :777266   NA's   :777265                                        
 DATA_SOURCE       
 Length:1572907    
 Class :character  
 Mode  :character  
                   
                   
                   
                   
length(unique(full$EVENT_TYPE))
[1] 74

Cleaning/Preparation

seperate BEGIN_YEARMONTH using a “-” and create new variable YMD that contains the year month and day seperated by a “-”

full$BEGIN_YEARMONTH <- gsub("(\\d{4})(\\d{2})", "\\1-\\2", full$BEGIN_YEARMONTH)
full$YMD <- paste(full$BEGIN_YEARMONTH, full$BEGIN_DAY, sep="-")
head(full)

Clean up DAMAGE_PROPERTY column so it can be used numerically and save as new variable

xin1 <- xin2 <- xin3 <- rep(NA,times=length(full$DAMAGE_PROPERTY))


for (i in 1:length(full$DAMAGE_PROPERTY)){
  if (grepl("K",full$DAMAGE_PROPERTY[i])==T){
    xin1[i] <- sub("K","",full$DAMAGE_PROPERTY[i])
  }
  if (grepl("M",full$DAMAGE_PROPERTY[i])==T){
    xin2[i] <- sub("M","",full$DAMAGE_PROPERTY[i])
  }
}
xin1 <- as.numeric(xin1)
xin2 <- as.numeric(xin2)
xin1 <- xin1 * 1000
xin2 <- xin2 * 1000000
xin1[is.na(xin1)] <- 0
xin2[is.na(xin2)] <- 0

xin3 <- xin1 + xin2
full$DAMAGE_PROPERTY_CLEAN <- xin3
head(full)

Adjust DAMAGE_PROPERTY_CLEAN column for inflation

#   using quantmod package to access consumer price index data
getSymbols("CPIAUCSL", src='FRED')
‘getSymbols’ currently uses auto.assign=TRUE by default, but will
use auto.assign=FALSE in 0.5-0. You will still be able to use
‘loadSymbols’ to automatically load data. getOption("getSymbols.env")
and getOption("getSymbols.auto.assign") will still be checked for
alternate defaults.

This message is shown once per session and may be disabled by setting 
options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
[1] "CPIAUCSL"
cpi <- CPIAUCSL

cpiMonths <- substr(index(cpi), 1, 7)

cpidf <- data.frame("months" = cpiMonths, "cpi" = cpi)
names(cpidf) <- c("months", "CPI")

full <- merge(full, cpidf, by.x= "BEGIN_YEARMONTH", by.y= "months")

# our dataset has the most recent storm recorded being in july when the 
# cpi was 255 so we are grabbing the cpi as of oct 1st (most recent for todays dollar)
cpitoday <- tail(cpi, 1)

full$multFactor <- as.vector(cpitoday) / full$CPI 

full$ADJ_DAMAGE_PROPERTY <- full$DAMAGE_PROPERTY_CLEAN * full$multFactor
head(full)

Time Series Plots

Direct Deaths by Month

one outlier that was over 1000 removed
d_by_m <- aggregate( DEATHS_DIRECT ~ BEGIN_YEARMONTH, FUN=sum, data=full )
names(d_by_m) <- c("BEGIN_YEARMONTH", "DEATHS_DIRECT")

windsor <- subset(d_by_m, DEATHS_DIRECT < 750)

n <- 20
numrow <- nrow(d_by_m)/n
seq1 <- seq(from=numrow, to=numrow*n-1, by=numrow)

ggplot(windsor, aes(BEGIN_YEARMONTH, DEATHS_DIRECT))+
  geom_point(size=.8)+
  scale_x_discrete(name="Year-Month", breaks=windsor$BEGIN_YEARMONTH[seq1])+
  ggtitle("Directly Related Deaths by Month over 70 years", subtitle = "*one outlier removed")+
  theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
  ylab("Directly Related Deaths")

Damaged property per month

#   aggregate deaths by year and month
d_by_m <- aggregate( ADJ_DAMAGE_PROPERTY ~ BEGIN_YEARMONTH, FUN=sum, data=full )
names(d_by_m) <- c("BEGIN_YEARMONTH", "ADJ_DAMAGE_PROPERTY")

#   create a sequence for plotting a certain number (n) of discrete x variable dates, used to index year month in scale_x_discrete()
n <- 20
numrow <- nrow(d_by_m)/n
seq1 <- seq(from=numrow, to=numrow*n-1, by=numrow)

#   PLOT!
ggplot(d_by_m, aes(BEGIN_YEARMONTH, ADJ_DAMAGE_PROPERTY))+
  geom_point(size=.8)+
  scale_x_discrete(name="Year-Month", breaks=d_by_m$BEGIN_YEARMONTH[seq1])+
  ggtitle("Property Damage by Month over 70 years")+
  theme(plot.title = element_text(hjust = 0.5))+
  ylab("Adjusted for Inflation Damage to Property ($)")+
  scale_y_continuous(label=comma)

Most dangerous storm deaths by day

here we can very clearly see that they started recording certain types of storms at different points in time
#   select relevant columns
cols <- c("YMD", "DEATHS_DIRECT", "EVENT_TYPE", "YEAR")
work <- full[,cols]

#   get most dangerous types of storms having DEATHS_DIRECT > third quartile
e_by_d <- aggregate(DEATHS_DIRECT ~ EVENT_TYPE, FUN = sum, data=full)
sub <- subset(e_by_d, DEATHS_DIRECT > 50) 

#   filter by most dangerous storm found above
#   DEATHS_DIRECT < 100 removes one outlier that affects all of the graphs in the facet wrap so I removed it
new <- subset(work, EVENT_TYPE %in% sub$EVENT_TYPE & DEATHS_DIRECT < 100)   

ggplot(new, aes(YMD, DEATHS_DIRECT))+
  geom_point(size=.5)+
  facet_wrap(vars(new$EVENT_TYPE))+
  ggtitle("Deaths Over Time for Most Dangerous Types of Events")+
  xlab("Year-Month-Day")+
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5), axis.text.x=element_blank())

Frequency of storm events for every year in data set

saved as two seperate large pdfs for viewability
#   used to get the count of each event type by year, from dplyr package
byYear <- full %>% count(YEAR, EVENT_TYPE)

#   this is to limit the graph to storms that are most frequent using the first quartile
byYear <- subset(byYear, n > summary(byYear$n)[2])  

seq1 <- 1950:1995
seq2 <- 1996:2019

firstSet <- byYear[byYear$YEAR %in% seq1,]
secondSet <- byYear[byYear$YEAR %in% seq2,]

#   the second set contains so many types of events it had to be limited to storms that are most frequent using the first quartile
secondSet <- subset(secondSet, n > summary(secondSet$n)[2])

#   PLOT!!!!
#   1953-1995
ggplot(firstSet, aes(EVENT_TYPE, n))+
  geom_bar(stat='Identity')+
  coord_flip()+
  facet_wrap(vars(firstSet$YEAR))+
  ggtitle("Frequency of Events by Year", subtitle = "1953-1995")+
  theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
  ylab("Frequency")+
  xlab("Event Type")


ggsave("event_frequency_1953-1995.pdf")
Saving 30 x 16 in image
#   1996-2019
ggplot(secondSet, aes(EVENT_TYPE, n))+
  geom_bar(stat='Identity')+
  coord_flip()+
  facet_wrap(vars(secondSet$YEAR))+
  ggtitle("Frequency of Events by Year", subtitle = "1996-2019")+
  theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5))+
  ylab("Frequency")+
  xlab("Event Type")


ggsave("event_frequency_1996-2019.pdf")
Saving 30 x 16 in image

Summary plots

Most Costly Events in terms of property damage

subset based on the mean for viewability
e_by_d <- aggregate(ADJ_DAMAGE_PROPERTY ~ EVENT_TYPE, FUN = sum, data=full)
sub <- subset(e_by_d, ADJ_DAMAGE_PROPERTY > mean(e_by_d$ADJ_DAMAGE_PROPERTY))  

ggplot(sub, aes(reorder(EVENT_TYPE, ADJ_DAMAGE_PROPERTY), ADJ_DAMAGE_PROPERTY))+
  geom_bar(stat = 'identity')+
  ggtitle("Most Costly Events in terms of Property Damage")+
  theme(plot.title = element_text(hjust = 0.5))+
  ylab("Property Damage Adjusted for Inflation ($)")+
  xlab("Event Types")+
  scale_y_continuous(label=comma)+
  coord_flip()

Storm Events based on frequency

#   obtain counts and subset out infrequent events using mean, again dplyr package
event <- full %>% count(EVENT_TYPE)
event <- subset(event, n >= mean(event$n)) 

#   PLOT!!!!
ggplot(event, aes(reorder(EVENT_TYPE, n), n))+
  geom_bar(stat='Identity')+
  ggtitle("Frequency of Events for the Past 70 Years")+
  theme(plot.title = element_text(hjust = 0.5))+
  ylab("Frequency")+
  xlab("Event Types")+
  coord_flip()+
  scale_y_continuous(labels = scales::comma)   # forces ggplot to stop using scientific notation for y-axis

t.tests between 1996-2008 and 2009-2019 aggregated by Year-Month

NOAA only collected data on three types of severe storms until 1996 so in order to compare past data to more recent data we had to choose a date range that contained the same types of storms
Seperate data into two sets of years that contain similar types of events
yrs1 <- 1996:2007
yrs2 <- 2008:2019

early <- full[full$YEAR %in% yrs1,]
late <- full[full$YEAR %in% yrs2,]

d_early <- aggregate( DEATHS_DIRECT ~ BEGIN_YEARMONTH, FUN=sum, data=early )
d_late <- aggregate( DEATHS_DIRECT ~ BEGIN_YEARMONTH, FUN=sum, data=late )

i_early <- aggregate( INJURIES_DIRECT ~ BEGIN_YEARMONTH, FUN=sum, data=early )
i_late <- aggregate( INJURIES_DIRECT ~ BEGIN_YEARMONTH, FUN=sum, data=late )

p_early <- aggregate( ADJ_DAMAGE_PROPERTY ~ BEGIN_YEARMONTH, FUN=sum, data=early )
p_late <- aggregate( ADJ_DAMAGE_PROPERTY ~ BEGIN_YEARMONTH, FUN=sum, data=late )


# check that there is a similar amount in each subset of data, they all have the same # of rows
nrow(d_early)
[1] 144
nrow(d_late)
[1] 138

t.test of damaged property aggregated by year-month

H0 = there is no difference in damaged property between the two date ranges,
HA = there is a significant difference in damaged property between the two date ranges
hist(p_early$ADJ_DAMAGE_PROPERTY)

hist(p_late$ADJ_DAMAGE_PROPERTY)


t.test(p_early$ADJ_DAMAGE_PROPERTY, p_late$ADJ_DAMAGE_PROPERTY)

    Welch Two Sample t-test

data:  p_early$ADJ_DAMAGE_PROPERTY and p_late$ADJ_DAMAGE_PROPERTY
t = -0.56822, df = 230.01, p-value = 0.5704
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -553018314  305446901
sample estimates:
mean of x mean of y 
849854710 973640417 

t.test of damaged property, outliers removed

thresh <- 1000000000

p_earlyOut <- subset(early, ADJ_DAMAGE_PROPERTY < thresh)
p_lateOut<- subset(late, ADJ_DAMAGE_PROPERTY < thresh)

p_early <- aggregate( ADJ_DAMAGE_PROPERTY ~ BEGIN_YEARMONTH, FUN=sum, data=p_earlyOut )
p_late <- aggregate( ADJ_DAMAGE_PROPERTY ~ BEGIN_YEARMONTH, FUN=sum, data=p_lateOut )

summary(p_early$ADJ_DAMAGE_PROPERTY)
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
   18506625   235335400   495839318   826047326   925555247 10794085770 
summary(p_late$ADJ_DAMAGE_PROPERTY)
       Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
   10750516   137834258   358143973   951391178   852358770 21480032375 
hist(p_early$ADJ_DAMAGE_PROPERTY)

hist(p_late$ADJ_DAMAGE_PROPERTY)


t.test(p_early$ADJ_DAMAGE_PROPERTY, p_late$ADJ_DAMAGE_PROPERTY)

    Welch Two Sample t-test

data:  p_early$ADJ_DAMAGE_PROPERTY and p_late$ADJ_DAMAGE_PROPERTY
t = -0.5933, df = 214.52, p-value = 0.5536
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -541765914  291078209
sample estimates:
mean of x mean of y 
826047326 951391178 

t.tests of individual storms comparing frequencies

H0 = storms are not more or less frequent between the two date ranges
HA = storms are more frequent in one of the date ranges than the other
write a function to t-test a list of different storms aggregating by year-month
test_freq <- function(events){
  return_list <- rep(NA,1)
  for (event in events){
    col_name <- paste(event, "_freq", sep="")
    
    early[col_name] <- grepl(event, early$EVENT_TYPE)
    late[col_name] <- grepl(event, late$EVENT_TYPE)
    
    f_early <- aggregate(eval(as.name(col_name)) ~ BEGIN_YEARMONTH, FUN=sum, early)
    f_late <- aggregate(eval(as.name(col_name)) ~ BEGIN_YEARMONTH, FUN=sum, late)
    
    test_list <- list('event' = col_name, 'test' = t.test(f_early[,2], f_late[,2]))
    return_list <- list.append(return_list, test_list)
  }
  return_list <- return_list[!is.na(return_list)]
  return(return_list)
}
using the function to test list of storms except hurricanes
# there are two different ways of putting hurricane into the data so that has to be handled seperately 
test_freq(events[2:length(events)])
$event
[1] "Tornado_freq"

$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -0.39215, df = 263.07, p-value = 0.6953
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -33.23437  22.19512
sample estimates:
mean of x mean of y 
 113.7847  119.3043 


[[3]]
[[3]]$event
[1] "Heat_freq"

[[3]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -0.61382, df = 227.87, p-value = 0.5399
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -72.73975  38.18480
sample estimates:
mean of x mean of y 
 88.88194 106.15942 



[[4]]
[[4]]$event
[1] "Flash Flood_freq"

[[4]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -1.6803, df = 250.39, p-value = 0.09415
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -108.105874    8.566019
sample estimates:
mean of x mean of y 
 270.5417  320.3116 



[[5]]
[[5]]$event
[1] "Flood_freq"

[[5]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -2.9679, df = 248.24, p-value = 0.003292
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -201.0214  -40.6453
sample estimates:
mean of x mean of y 
 439.1667  560.0000 



[[6]]
[[6]]$event
[1] "Thunderstorm Wind_freq"

[[6]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -2.7053, df = 242.34, p-value = 0.00731
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -727.2114 -114.4003
sample estimates:
mean of x mean of y 
 1046.035  1466.841 



[[7]]
[[7]]$event
[1] "Hail_freq"

[[7]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = 0.41126, df = 278.71, p-value = 0.6812
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -199.0246  304.1484
sample estimates:
mean of x mean of y 
1033.0764  980.5145 



[[8]]
[[8]]$event
[1] "High Wind_freq"

[[8]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -1.3293, df = 277.24, p-value = 0.1849
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -85.16946  16.51004
sample estimates:
mean of x mean of y 
 228.0833  262.4130 



[[9]]
[[9]]$event
[1] "Wildfire_freq"

[[9]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -2.9929, df = 268.48, p-value = 0.003021
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -15.125306  -3.121675
sample estimates:
mean of x mean of y 
 20.34028  29.46377 



[[10]]
[[10]]$event
[1] "Lightning_freq"

[[10]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = 2.9215, df = 264.73, p-value = 0.003784
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  7.603057 39.034020
sample estimates:
mean of x mean of y 
 69.84028  46.52174 



[[11]]
[[11]]$event
[1] "Rip Current_freq"

[[11]]$test

    Welch Two Sample t-test

data:  f_early[, 2] and f_late[, 2]
t = -3.5412, df = 234.31, p-value = 0.0004804
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.1329015 -0.8930647
sample estimates:
mean of x mean of y 
 3.631944  5.644928 
testing hurricanes manually
event <- "Hurricane"

early$hurricane_freq <- grepl(event, early$EVENT_TYPE)
late$hurricane_freq <- grepl(event, late$EVENT_TYPE)

f_early <- aggregate(hurricane_freq ~ BEGIN_YEARMONTH, FUN=sum, early)
f_late <- aggregate(hurricane_freq ~ BEGIN_YEARMONTH, FUN=sum, late)


t.test(f_early$hurricane_freq, f_late$hurricane_freq)

    Welch Two Sample t-test

data:  f_early$hurricane_freq and f_late$hurricane_freq
t = 2.9066, df = 161.13, p-value = 0.004168
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  2.903162 15.208553
sample estimates:
mean of x mean of y 
11.381944  2.326087 
This code is looking at the three types of events we have consistently recorded throughout the 70 years: Hail, Thunderstorm Wind, and Tornadoes. The frequency of these events increase significantly in the later set of years from 1986-2019 but this is most likely due to better or more consistent recording practices by NOAA as opposed to these storms actually being that much more frequent.
yrs1 <- 1950:1985
yrs2 <- 1986:2019

early <- full[full$YEAR %in% yrs1,]
late <- full[full$YEAR %in% yrs2,]

early %>% count(EVENT_TYPE)
l <- late %>% count(EVENT_TYPE)
l[l$EVENT_TYPE %in% c("Hail", "Thunderstorm Wind", "Tornado"),]

Time Series Analysis


### animated times series graph over years
year <- as.numeric(substr(full$BEGIN_YEARMONTH, 1, 4))
head(year)
[1] 1950 1950 1950 1950 1950 1950
table(year)         #  data includes records from 1950 - 2019
year
 1950  1951  1952  1953  1954  1955  1956  1957  1958  1959  1960  1961  1962  1963  1964  1965  1966 
  223   269   272   492   609  1413  1703  2184  2213  1813  1945  2246  2389  1968  2348  2835  2388 
 1967  1968  1969  1970  1971  1972  1973  1974  1975  1976  1977  1978  1979  1980  1981  1982  1983 
 2688  3312  2926  3215  3471  2171  4453  5375  4975  3768  3728  3657  4279  6136  4517  7126  8322 
 1984  1985  1986  1987  1988  1989  1990  1991  1992  1993  1994  1995  1996  1997  1998  1999  2000 
 7335  7979  8725  7363  7257 10407 10945 12516 13534  8664 15627 20461 48569 41983 50973 46383 52007 
 2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017 
48875 50936 52956 52409 53976 56400 59010 71190 57398 62804 79091 64503 59985 59465 57788 56003 57024 
 2018  2019 
62351 38586 
max(year) - min(year)  # equals 69, that's good!
[1] 69
full$year <- year
timess <- full %>% count(year)  # matches the values from table function (line 45)
plot(timess, ylab = 'number of records', type = 'l', main = 'Time series for all event types from 1950-2019')

givemedf <- as.data.frame(table(year))
givemedf$year <- as.integer(as.numeric(levels(givemedf$year))[givemedf$year])
#givemedf$year <- as.Date(as.character(givemedf$year), "%Y")

ggplot(givemedf, aes(year, Freq)) +             # animated time series plot for all event types
  geom_line() + 
  geom_point(size = 2) +
  transition_reveal(year) + 
  labs(title = "Year: {frame_along}", x = 'year', y = 'number of records') #+
  [1] "./gganim_plot0001.png" "./gganim_plot0002.png" "./gganim_plot0003.png" "./gganim_plot0004.png"
  [5] "./gganim_plot0005.png" "./gganim_plot0006.png" "./gganim_plot0007.png" "./gganim_plot0008.png"
  [9] "./gganim_plot0009.png" "./gganim_plot0010.png" "./gganim_plot0011.png" "./gganim_plot0012.png"
 [13] "./gganim_plot0013.png" "./gganim_plot0014.png" "./gganim_plot0015.png" "./gganim_plot0016.png"
 [17] "./gganim_plot0017.png" "./gganim_plot0018.png" "./gganim_plot0019.png" "./gganim_plot0020.png"
 [21] "./gganim_plot0021.png" "./gganim_plot0022.png" "./gganim_plot0023.png" "./gganim_plot0024.png"
 [25] "./gganim_plot0025.png" "./gganim_plot0026.png" "./gganim_plot0027.png" "./gganim_plot0028.png"
 [29] "./gganim_plot0029.png" "./gganim_plot0030.png" "./gganim_plot0031.png" "./gganim_plot0032.png"
 [33] "./gganim_plot0033.png" "./gganim_plot0034.png" "./gganim_plot0035.png" "./gganim_plot0036.png"
 [37] "./gganim_plot0037.png" "./gganim_plot0038.png" "./gganim_plot0039.png" "./gganim_plot0040.png"
 [41] "./gganim_plot0041.png" "./gganim_plot0042.png" "./gganim_plot0043.png" "./gganim_plot0044.png"
 [45] "./gganim_plot0045.png" "./gganim_plot0046.png" "./gganim_plot0047.png" "./gganim_plot0048.png"
 [49] "./gganim_plot0049.png" "./gganim_plot0050.png" "./gganim_plot0051.png" "./gganim_plot0052.png"
 [53] "./gganim_plot0053.png" "./gganim_plot0054.png" "./gganim_plot0055.png" "./gganim_plot0056.png"
 [57] "./gganim_plot0057.png" "./gganim_plot0058.png" "./gganim_plot0059.png" "./gganim_plot0060.png"
 [61] "./gganim_plot0061.png" "./gganim_plot0062.png" "./gganim_plot0063.png" "./gganim_plot0064.png"
 [65] "./gganim_plot0065.png" "./gganim_plot0066.png" "./gganim_plot0067.png" "./gganim_plot0068.png"
 [69] "./gganim_plot0069.png" "./gganim_plot0070.png" "./gganim_plot0071.png" "./gganim_plot0072.png"
 [73] "./gganim_plot0073.png" "./gganim_plot0074.png" "./gganim_plot0075.png" "./gganim_plot0076.png"
 [77] "./gganim_plot0077.png" "./gganim_plot0078.png" "./gganim_plot0079.png" "./gganim_plot0080.png"
 [81] "./gganim_plot0081.png" "./gganim_plot0082.png" "./gganim_plot0083.png" "./gganim_plot0084.png"
 [85] "./gganim_plot0085.png" "./gganim_plot0086.png" "./gganim_plot0087.png" "./gganim_plot0088.png"
 [89] "./gganim_plot0089.png" "./gganim_plot0090.png" "./gganim_plot0091.png" "./gganim_plot0092.png"
 [93] "./gganim_plot0093.png" "./gganim_plot0094.png" "./gganim_plot0095.png" "./gganim_plot0096.png"
 [97] "./gganim_plot0097.png" "./gganim_plot0098.png" "./gganim_plot0099.png" "./gganim_plot0100.png"
attr(,"frame_vars")
    frame nframes progress frame_along
1       1     100     0.01        1950
2       2     100     0.02        1951
3       3     100     0.03        1951
4       4     100     0.04        1952
5       5     100     0.05        1953
6       6     100     0.06        1953
7       7     100     0.07        1954
8       8     100     0.08        1955
9       9     100     0.09        1956
10     10     100     0.10        1956
11     11     100     0.11        1957
12     12     100     0.12        1958
13     13     100     0.13        1958
14     14     100     0.14        1959
15     15     100     0.15        1960
16     16     100     0.16        1960
17     17     100     0.17        1961
18     18     100     0.18        1962
19     19     100     0.19        1963
20     20     100     0.20        1963
21     21     100     0.21        1964
22     22     100     0.22        1965
23     23     100     0.23        1965
24     24     100     0.24        1966
25     25     100     0.25        1967
26     26     100     0.26        1967
27     27     100     0.27        1968
28     28     100     0.28        1969
29     29     100     0.29        1970
30     30     100     0.30        1970
31     31     100     0.31        1971
32     32     100     0.32        1972
33     33     100     0.33        1972
34     34     100     0.34        1973
35     35     100     0.35        1974
36     36     100     0.36        1974
37     37     100     0.37        1975
38     38     100     0.38        1976
39     39     100     0.39        1976
40     40     100     0.40        1977
41     41     100     0.41        1978
42     42     100     0.42        1979
43     43     100     0.43        1979
44     44     100     0.44        1980
45     45     100     0.45        1981
46     46     100     0.46        1981
47     47     100     0.47        1982
48     48     100     0.48        1983
49     49     100     0.49        1983
50     50     100     0.50        1984
51     51     100     0.51        1985
52     52     100     0.52        1986
53     53     100     0.53        1986
54     54     100     0.54        1987
55     55     100     0.55        1988
56     56     100     0.56        1988
57     57     100     0.57        1989
58     58     100     0.58        1990
59     59     100     0.59        1990
60     60     100     0.60        1991
61     61     100     0.61        1992
62     62     100     0.62        1993
63     63     100     0.63        1993
64     64     100     0.64        1994
65     65     100     0.65        1995
66     66     100     0.66        1995
67     67     100     0.67        1996
68     68     100     0.68        1997
69     69     100     0.69        1997
70     70     100     0.70        1998
71     71     100     0.71        1999
72     72     100     0.72        1999
73     73     100     0.73        2000
74     74     100     0.74        2001
75     75     100     0.75        2002
76     76     100     0.76        2002
77     77     100     0.77        2003
78     78     100     0.78        2004
79     79     100     0.79        2004
80     80     100     0.80        2005
81     81     100     0.81        2006
82     82     100     0.82        2006
83     83     100     0.83        2007
84     84     100     0.84        2008
85     85     100     0.85        2009
86     86     100     0.86        2009
87     87     100     0.87        2010
88     88     100     0.88        2011
89     89     100     0.89        2011
90     90     100     0.90        2012
91     91     100     0.91        2013
92     92     100     0.92        2013
93     93     100     0.93        2014
94     94     100     0.94        2015
95     95     100     0.95        2016
96     96     100     0.96        2016
97     97     100     0.97        2017
98     98     100     0.98        2018
99     99     100     0.99        2018
100   100     100     1.00        2019
                                                                                     frame_source
1   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0001.png
2   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0002.png
3   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0003.png
4   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0004.png
5   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0005.png
6   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0006.png
7   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0007.png
8   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0008.png
9   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0009.png
10  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0010.png
11  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0011.png
12  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0012.png
13  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0013.png
14  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0014.png
15  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0015.png
16  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0016.png
17  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0017.png
18  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0018.png
19  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0019.png
20  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0020.png
21  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0021.png
22  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0022.png
23  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0023.png
24  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0024.png
25  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0025.png
26  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0026.png
27  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0027.png
28  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0028.png
29  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0029.png
30  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0030.png
31  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0031.png
32  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0032.png
33  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0033.png
34  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0034.png
35  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0035.png
36  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0036.png
37  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0037.png
38  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0038.png
39  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0039.png
40  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0040.png
41  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0041.png
42  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0042.png
43  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0043.png
44  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0044.png
45  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0045.png
46  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0046.png
47  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0047.png
48  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0048.png
49  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0049.png
50  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0050.png
51  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0051.png
52  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0052.png
53  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0053.png
54  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0054.png
55  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0055.png
56  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0056.png
57  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0057.png
58  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0058.png
59  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0059.png
60  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0060.png
61  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0061.png
62  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0062.png
63  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0063.png
64  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0064.png
65  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0065.png
66  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0066.png
67  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0067.png
68  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0068.png
69  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0069.png
70  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0070.png
71  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0071.png
72  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0072.png
73  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0073.png
74  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0074.png
75  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0075.png
76  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0076.png
77  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0077.png
78  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0078.png
79  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0079.png
80  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0080.png
81  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0081.png
82  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0082.png
83  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0083.png
84  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0084.png
85  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0085.png
86  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0086.png
87  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0087.png
88  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0088.png
89  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0089.png
90  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0090.png
91  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0091.png
92  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0092.png
93  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0093.png
94  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0094.png
95  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0095.png
96  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0096.png
97  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0097.png
98  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0098.png
99  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0099.png
100 /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da773ef3a526/gganim_plot0100.png
  #anim_save('all_event_new.gif')             # Comment this line if you don't want to save it as a gif locally

fancy <- as.data.frame(head(sort(table(full$EVENT_TYPE)[table(full$EVENT_TYPE) > 10000],decreasing = T),9))
colnames(fancy)[1] <- "event_type"
fancy                               # Top 9 event types with most records
flag <- fancy[,1]
fullflag <- full[full$EVENT_TYPE==flag,]
longer object length is not a multiple of shorter object lengthlonger object length is not a multiple of shorter object length
table(fullflag$EVENT_TYPE,fullflag$year)      # 6 event types with 0 records until 1995 (Drought, Flash Flood, HS, HW, WS, WW)
                   
                    1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966
  Drought              0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Flash Flood          0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Hail                 0    0    0    0    0   39   47   56   74   56   62   87  103   70   82   88   88
  Heavy Snow           0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  High Wind            0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Thunderstorm Wind    0    0    0    0    0   42   89   74   79   71   78   86   88   88   93  108  111
  Tornado             25   30   30   55   67   75   67  102   61   57   71   87   71   64   80  113   63
  Winter Storm         0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Winter Weather       0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
                   
                    1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983
  Drought              0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Flash Flood          0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Hail                83  113   85   79   99   73  110  184  154  128  110  114  151  213  164  285  260
  Heavy Snow           0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  High Wind            0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Thunderstorm Wind   95  175  173  194  167   77  224  293  305  184  189  210  241  344  241  400  564
  Tornado            106   81   77   76  116   87  123  128  103  109   98   99  108  110   93  120  103
  Winter Storm         0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  Winter Weather       0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
                   
                    1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
  Drought              0    0    0    0    0    0    0    0    0    0    0    0   72   45  192  285  254
  Flash Flood          0    0    0    0    0    0    0    0    0    0    0    0  372  314  401  295  302
  Hail               316  392  403  289  287  428  409  509  651  462  755  932 1219  952 1402 1127 1233
  Heavy Snow           0    0    0    0    0    0    0    0    0    0    0    0  480  346  258  279  444
  High Wind            0    0    0    0    0    0    0    0    0    0    0    0  415  301  248  354  332
  Thunderstorm Wind  388  443  444  466  455  637  693  733  741  447  853 1226 1137 1094 1520 1118 1349
  Tornado            110   98   85   86   92  102  147  145  157   74   90  153  145  123  141  189  131
  Winter Storm         0    0    0    0    0    0    0    0    0    0    0    0  351  357  218  336  458
  Winter Weather       0    0    0    0    0    0    0    0    0    0    0    0   72  124   89  130   51
                   
                    2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
  Drought            199  218  111   60  170  290  398  216  158  175  614  878  584  301  149  267  136
  Flash Flood        327  360  454  533  329  297  412  430  444  447  396  257  530  321  566  417  386
  Hail              1286 1373 1542 1475 1498 1844 1401 1965 1483 1241 1938 1496 1045 1120 1025 1034 1148
  Heavy Snow         315  371  318  240  305  170  285  309  256  397  305  159  252  305  292  156  193
  High Wind          320  354  244  268  264  308  251  413  323  311  354  379  247  346  230  350  402
  Thunderstorm Wind 1311 1321 1378 1332 1307 1490 1468 1861 1445 1749 2324 1795 1660 1546 1588 1746 1830
  Tornado            133  137  168  213  153  134  135  212  166  157  242  119  117  111  124  104  193
  Winter Storm       278  373  402  351  334  215  346  457  373  424  352  196  415  437  402  259  241
  Winter Weather      83   42  192  182  222  171  376  447  312  478  417  308  531  534  460  304  285
                   
                    2018 2019
  Drought            273   17
  Flash Flood        474  229
  Hail               901  602
  Heavy Snow         239  218
  High Wind          328  256
  Thunderstorm Wind 1669 1102
  Tornado            131  148
  Winter Storm       397  241
  Winter Weather     491  269
givemedf2 <- as.data.frame(table(fullflag$EVENT_TYPE,fullflag$year))
givemedf2$Var2 <- as.integer(as.numeric(levels(givemedf2$Var2))[givemedf2$Var2])
#givemedf2$Var2 <- as.Date(as.character(givemedf2$Var2), "%Y")

ggplot(givemedf2, aes(Var2, Freq, group=Var1)) +              # animated time series plot for top 9 event types with most records
  geom_line(aes(col = Var1), size = 1) +
  scale_colour_discrete("event type") +
  geom_point(size = 2) +
  transition_reveal(Var2) + 
  labs(title = "Year: {frame_along}", x = 'year', y = 'number of records') #+
  [1] "./gganim_plot0001.png" "./gganim_plot0002.png" "./gganim_plot0003.png" "./gganim_plot0004.png"
  [5] "./gganim_plot0005.png" "./gganim_plot0006.png" "./gganim_plot0007.png" "./gganim_plot0008.png"
  [9] "./gganim_plot0009.png" "./gganim_plot0010.png" "./gganim_plot0011.png" "./gganim_plot0012.png"
 [13] "./gganim_plot0013.png" "./gganim_plot0014.png" "./gganim_plot0015.png" "./gganim_plot0016.png"
 [17] "./gganim_plot0017.png" "./gganim_plot0018.png" "./gganim_plot0019.png" "./gganim_plot0020.png"
 [21] "./gganim_plot0021.png" "./gganim_plot0022.png" "./gganim_plot0023.png" "./gganim_plot0024.png"
 [25] "./gganim_plot0025.png" "./gganim_plot0026.png" "./gganim_plot0027.png" "./gganim_plot0028.png"
 [29] "./gganim_plot0029.png" "./gganim_plot0030.png" "./gganim_plot0031.png" "./gganim_plot0032.png"
 [33] "./gganim_plot0033.png" "./gganim_plot0034.png" "./gganim_plot0035.png" "./gganim_plot0036.png"
 [37] "./gganim_plot0037.png" "./gganim_plot0038.png" "./gganim_plot0039.png" "./gganim_plot0040.png"
 [41] "./gganim_plot0041.png" "./gganim_plot0042.png" "./gganim_plot0043.png" "./gganim_plot0044.png"
 [45] "./gganim_plot0045.png" "./gganim_plot0046.png" "./gganim_plot0047.png" "./gganim_plot0048.png"
 [49] "./gganim_plot0049.png" "./gganim_plot0050.png" "./gganim_plot0051.png" "./gganim_plot0052.png"
 [53] "./gganim_plot0053.png" "./gganim_plot0054.png" "./gganim_plot0055.png" "./gganim_plot0056.png"
 [57] "./gganim_plot0057.png" "./gganim_plot0058.png" "./gganim_plot0059.png" "./gganim_plot0060.png"
 [61] "./gganim_plot0061.png" "./gganim_plot0062.png" "./gganim_plot0063.png" "./gganim_plot0064.png"
 [65] "./gganim_plot0065.png" "./gganim_plot0066.png" "./gganim_plot0067.png" "./gganim_plot0068.png"
 [69] "./gganim_plot0069.png" "./gganim_plot0070.png" "./gganim_plot0071.png" "./gganim_plot0072.png"
 [73] "./gganim_plot0073.png" "./gganim_plot0074.png" "./gganim_plot0075.png" "./gganim_plot0076.png"
 [77] "./gganim_plot0077.png" "./gganim_plot0078.png" "./gganim_plot0079.png" "./gganim_plot0080.png"
 [81] "./gganim_plot0081.png" "./gganim_plot0082.png" "./gganim_plot0083.png" "./gganim_plot0084.png"
 [85] "./gganim_plot0085.png" "./gganim_plot0086.png" "./gganim_plot0087.png" "./gganim_plot0088.png"
 [89] "./gganim_plot0089.png" "./gganim_plot0090.png" "./gganim_plot0091.png" "./gganim_plot0092.png"
 [93] "./gganim_plot0093.png" "./gganim_plot0094.png" "./gganim_plot0095.png" "./gganim_plot0096.png"
 [97] "./gganim_plot0097.png" "./gganim_plot0098.png" "./gganim_plot0099.png" "./gganim_plot0100.png"
attr(,"frame_vars")
    frame nframes progress frame_along
1       1     100     0.01        1950
2       2     100     0.02        1951
3       3     100     0.03        1951
4       4     100     0.04        1952
5       5     100     0.05        1953
6       6     100     0.06        1953
7       7     100     0.07        1954
8       8     100     0.08        1955
9       9     100     0.09        1956
10     10     100     0.10        1956
11     11     100     0.11        1957
12     12     100     0.12        1958
13     13     100     0.13        1958
14     14     100     0.14        1959
15     15     100     0.15        1960
16     16     100     0.16        1960
17     17     100     0.17        1961
18     18     100     0.18        1962
19     19     100     0.19        1963
20     20     100     0.20        1963
21     21     100     0.21        1964
22     22     100     0.22        1965
23     23     100     0.23        1965
24     24     100     0.24        1966
25     25     100     0.25        1967
26     26     100     0.26        1967
27     27     100     0.27        1968
28     28     100     0.28        1969
29     29     100     0.29        1970
30     30     100     0.30        1970
31     31     100     0.31        1971
32     32     100     0.32        1972
33     33     100     0.33        1972
34     34     100     0.34        1973
35     35     100     0.35        1974
36     36     100     0.36        1974
37     37     100     0.37        1975
38     38     100     0.38        1976
39     39     100     0.39        1976
40     40     100     0.40        1977
41     41     100     0.41        1978
42     42     100     0.42        1979
43     43     100     0.43        1979
44     44     100     0.44        1980
45     45     100     0.45        1981
46     46     100     0.46        1981
47     47     100     0.47        1982
48     48     100     0.48        1983
49     49     100     0.49        1983
50     50     100     0.50        1984
51     51     100     0.51        1985
52     52     100     0.52        1986
53     53     100     0.53        1986
54     54     100     0.54        1987
55     55     100     0.55        1988
56     56     100     0.56        1988
57     57     100     0.57        1989
58     58     100     0.58        1990
59     59     100     0.59        1990
60     60     100     0.60        1991
61     61     100     0.61        1992
62     62     100     0.62        1993
63     63     100     0.63        1993
64     64     100     0.64        1994
65     65     100     0.65        1995
66     66     100     0.66        1995
67     67     100     0.67        1996
68     68     100     0.68        1997
69     69     100     0.69        1997
70     70     100     0.70        1998
71     71     100     0.71        1999
72     72     100     0.72        1999
73     73     100     0.73        2000
74     74     100     0.74        2001
75     75     100     0.75        2002
76     76     100     0.76        2002
77     77     100     0.77        2003
78     78     100     0.78        2004
79     79     100     0.79        2004
80     80     100     0.80        2005
81     81     100     0.81        2006
82     82     100     0.82        2006
83     83     100     0.83        2007
84     84     100     0.84        2008
85     85     100     0.85        2009
86     86     100     0.86        2009
87     87     100     0.87        2010
88     88     100     0.88        2011
89     89     100     0.89        2011
90     90     100     0.90        2012
91     91     100     0.91        2013
92     92     100     0.92        2013
93     93     100     0.93        2014
94     94     100     0.94        2015
95     95     100     0.95        2016
96     96     100     0.96        2016
97     97     100     0.97        2017
98     98     100     0.98        2018
99     99     100     0.99        2018
100   100     100     1.00        2019
                                                                                    frame_source
1   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0001.png
2   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0002.png
3   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0003.png
4   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0004.png
5   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0005.png
6   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0006.png
7   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0007.png
8   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0008.png
9   /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0009.png
10  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0010.png
11  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0011.png
12  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0012.png
13  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0013.png
14  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0014.png
15  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0015.png
16  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0016.png
17  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0017.png
18  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0018.png
19  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0019.png
20  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0020.png
21  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0021.png
22  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0022.png
23  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0023.png
24  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0024.png
25  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0025.png
26  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0026.png
27  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0027.png
28  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0028.png
29  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0029.png
30  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0030.png
31  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0031.png
32  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0032.png
33  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0033.png
34  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0034.png
35  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0035.png
36  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0036.png
37  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0037.png
38  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0038.png
39  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0039.png
40  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0040.png
41  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0041.png
42  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0042.png
43  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0043.png
44  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0044.png
45  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0045.png
46  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0046.png
47  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0047.png
48  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0048.png
49  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0049.png
50  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0050.png
51  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0051.png
52  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0052.png
53  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0053.png
54  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0054.png
55  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0055.png
56  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0056.png
57  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0057.png
58  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0058.png
59  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0059.png
60  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0060.png
61  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0061.png
62  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0062.png
63  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0063.png
64  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0064.png
65  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0065.png
66  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0066.png
67  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0067.png
68  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0068.png
69  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0069.png
70  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0070.png
71  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0071.png
72  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0072.png
73  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0073.png
74  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0074.png
75  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0075.png
76  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0076.png
77  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0077.png
78  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0078.png
79  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0079.png
80  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0080.png
81  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0081.png
82  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0082.png
83  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0083.png
84  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0084.png
85  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0085.png
86  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0086.png
87  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0087.png
88  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0088.png
89  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0089.png
90  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0090.png
91  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0091.png
92  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0092.png
93  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0093.png
94  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0094.png
95  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0095.png
96  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0096.png
97  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0097.png
98  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0098.png
99  /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0099.png
100 /var/folders/n2/lc639sxd11v3ckv2rbnwxt8r0000gn/T//RtmpQsQnnu/da77d37966b/gganim_plot0100.png

  #anim_save('top9_new.gif')       # Comment this line if you don't want to save it as a gif locally

### severe weather in Colorado predictive model
full2 <- full[(full$STATE=='COLORADO') & (full$year != 2019),]     # subset all Colorado records & get rid of 2019 (since no year-long data)
fancy <- as.data.frame(head(sort(table(full2$EVENT_TYPE),decreasing = T),9))     # Top 9 most happened severe weather in Colorado
colnames(fancy)[1] <- "event_type"                                    # Hail, Winter Storm, Winter Weather, Thunderstorm...
fancy

timess2 <- full2 %>% count(year)
plot(timess2, ylab = 'number of records', type = 'l', main = 'Time series for all event types happened in Colorado from 1950-2018')     # Time series plot for all severe weather types in Colorado

par(mfrow = c(3,3))

arnumber <- rep(NA, times=nrow(fancy))
pred19 <- rep(NA, times=nrow(fancy))
pred20 <- rep(NA, times=nrow(fancy))

for (i in 1:nrow(fancy)){
  fullsub <- full2[full2$EVENT_TYPE==fancy[i,1],]
  newtimess <- fullsub %>% count(year)
  newtimess <- as.data.frame(newtimess)
  plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[i,1]))
  ar1 <- ar(newtimess[,2])
  arnumber[i] <- ar1$order
  predRe <- predict(ar1,n.ahead = 2)
  pred19[i] <- predRe$pred[1]
  pred20[i] <- predRe$pred[2]
}



#################### Example of Hail (Colorado)
par(mfrow = c(1,1))

fullsub <- full2[full2$EVENT_TYPE==fancy[1,1],]
newtimess <- fullsub %>% count(year)
newtimess <- as.data.frame(newtimess)
plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[1,1]))

par(mfrow = c(1,2))

acf(newtimess[,2])
pacf(newtimess[,2])
## Since pacf displays a sharp cutoff and acf displays a slow decay, this series displays an "ar signature"
## by reading both pacf and acf, we are confident to use ar(15) model since PACF cut off is at lag 15.


#################### Example of Drought (Colorado)
par(mfrow = c(1,1))

fullsub <- full2[full2$EVENT_TYPE==fancy[6,1],]
newtimess <- fullsub %>% count(year)
newtimess <- as.data.frame(newtimess)
plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[6,1]))

par(mfrow = c(1,2))

acf(newtimess[,2])
pacf(newtimess[,2])


## We can see that for Drought, there is no strong geometry decay pattern for both acf and pacf, so it's not a good idea
## to use ar function on Drought (similar situation for High Wind, Flash Flood). It's also interesting for ar model of 
## this type of weather, the automatically selected order window is 0. And the 2019 prediction ^ 2020 prediction are the same.

arnumber_new <- arnumber
pred19_new <- floor(pred19)
pred20_new <- floor(pred20)
fancytype <- as.character(fancy[,1])

givemetable <- cbind(fancytype, arnumber_new, pred19_new, pred20_new)
colnames(givemetable)[1] <- "Event Type"
colnames(givemetable)[2] <- "Lag Window"
colnames(givemetable)[3] <- "2019 Prediction"
colnames(givemetable)[4] <- "2020 Prediction"
xtable(givemetable)
% latex table generated in R 3.6.1 by xtable 1.8-4 package
% Sat Nov 23 17:29:40 2019
\begin{table}[ht]
\centering
\begin{tabular}{rllll}
  \hline
 & Event Type & Lag Window & 2019 Prediction & 2020 Prediction \\ 
  \hline
1 & Hail & 2 & 468 & 485 \\ 
  2 & Winter Storm & 1 & 148 & 179 \\ 
  3 & Winter Weather & 1 & 274 & 262 \\ 
  4 & Thunderstorm Wind & 6 & 76 & 87 \\ 
  5 & High Wind & 0 & 110 & 110 \\ 
  6 & Drought & 0 & 145 & 145 \\ 
  7 & Tornado & 8 & 40 & 41 \\ 
  8 & Heavy Snow & 1 & 44 & 60 \\ 
  9 & Flash Flood & 0 & 51 & 51 \\ 
   \hline
\end{tabular}
\end{table}

Predictive Modelling

### severe weather in Colorado predictive model
full2 <- full[(full$STATE=='COLORADO') & (full$year != 2019),]     # subset all Colorado records & get rid of 2019 (since no year-long data)
fancy <- as.data.frame(head(sort(table(full2$EVENT_TYPE),decreasing = T),9))     # Top 9 most happened severe weather in Colorado
colnames(fancy)[1] <- "event_type"                                    # Hail, Winter Storm, Winter Weather, Thunderstorm...
fancy

timess2 <- full2 %>% count(year)
plot(timess2, ylab = 'number of records', type = 'l', main = 'Time series for all event types happened in Colorado from 1950-2018')     # Time series plot for all severe weather types in Colorado

par(mfrow = c(3,3))

arnumber <- rep(NA, times=nrow(fancy))
pred19 <- rep(NA, times=nrow(fancy))
pred20 <- rep(NA, times=nrow(fancy))

for (i in 1:nrow(fancy)){
  fullsub <- full2[full2$EVENT_TYPE==fancy[i,1],]
  newtimess <- fullsub %>% count(year)
  newtimess <- as.data.frame(newtimess)
  plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[i,1]))
  ar1 <- ar(newtimess[,2])
  arnumber[i] <- ar1$order
  predRe <- predict(ar1,n.ahead = 2)
  pred19[i] <- predRe$pred[1]
  pred20[i] <- predRe$pred[2]
}

#################### Example of Hail (Colorado)
par(mfrow = c(1,1))
fullsub <- full2[full2$EVENT_TYPE==fancy[1,1],]
newtimess <- fullsub %>% count(year)
newtimess <- as.data.frame(newtimess)
plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[1,1]))

par(mfrow = c(1,2))

acf(newtimess[,2])
pacf(newtimess[,2])

## Since pacf displays a sharp cutoff and acf displays a slow decay, this series displays an "ar signature"
## by reading both pacf and acf, we are confident to use ar(15) model since PACF cut off is at lag 15.
#################### Example of Drought (Colorado)
par(mfrow = c(1,1))
fullsub <- full2[full2$EVENT_TYPE==fancy[6,1],]
newtimess <- fullsub %>% count(year)
newtimess <- as.data.frame(newtimess)
plot(newtimess, ylab = 'number of records', type = 'l', main = paste(fancy[6,1]))

par(mfrow = c(1,2))

acf(newtimess[,2])
pacf(newtimess[,2])


## We can see that for Drought, there is no strong geometry decay pattern for both acf and pacf, so it's not a good idea
## to use ar function on Drought (similar situation for High Wind, Flash Flood). It's also interesting for ar model of 
## this type of weather, the automatically selected order window is 0. And the 2019 prediction ^ 2020 prediction are the same.
arnumber_new <- arnumber
pred19_new <- floor(pred19)
pred20_new <- floor(pred20)
fancytype <- as.character(fancy[,1])

givemetable <- cbind(fancytype, arnumber_new, pred19_new, pred20_new)
colnames(givemetable)[1] <- "Event Type"
colnames(givemetable)[2] <- "Lag Window"
colnames(givemetable)[3] <- "2019 Prediction"
colnames(givemetable)[4] <- "2020 Prediction"
xtable(givemetable)
% latex table generated in R 3.6.1 by xtable 1.8-4 package
% Sat Nov 23 17:33:42 2019
\begin{table}[ht]
\centering
\begin{tabular}{rllll}
  \hline
 & Event Type & Lag Window & 2019 Prediction & 2020 Prediction \\ 
  \hline
1 & Hail & 2 & 468 & 485 \\ 
  2 & Winter Storm & 1 & 148 & 179 \\ 
  3 & Winter Weather & 1 & 274 & 262 \\ 
  4 & Thunderstorm Wind & 6 & 76 & 87 \\ 
  5 & High Wind & 0 & 110 & 110 \\ 
  6 & Drought & 0 & 145 & 145 \\ 
  7 & Tornado & 8 & 40 & 41 \\ 
  8 & Heavy Snow & 1 & 44 & 60 \\ 
  9 & Flash Flood & 0 & 51 & 51 \\ 
   \hline
\end{tabular}
\end{table}

Creating the fullWeather.csv file from the downloaded NOAA files

Rename files in details folder to allow for binding of data (only needed to be performed once)

Bind files from every year together into dataframe labelled “full” (70 years worth of data!) then export to csv file for ease of use and sharing purposes (only needed to be performed once)

LS0tCnRpdGxlOiAiU2V2ZXJlIFdlYXRoZXIgRGF0YSBmcm9tIE5PQUEgMTk1MC0yMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vawotLS0KIyMgYnk6IEthZWdhbiBDYXNleSwgUGF0cmljayBEdXJraW4sIE1lbmdjaGFvIExpLCBZb25nYm8gU2h1LCBZaXdlaSBZYW4KIyMjIGRhdGE6IFtodHRwczovL3d3dzEubmNkYy5ub2FhLmdvdi9wdWIvZGF0YS9zd2RpL3N0b3JtZXZlbnRzL2NzdmZpbGVzL10oaHR0cHM6Ly93d3cxLm5jZGMubm9hYS5nb3YvcHViL2RhdGEvc3dkaS9zdG9ybWV2ZW50cy9jc3ZmaWxlcy8pCgoqKioKIyA8YSBuYW1lPSJuYXYiPjwvYT4KIyBOYXZpZ2F0aW9uOgojIyMjIyMgSW50cm9kdWN0aW9uOgoxLiBbSW1wb3J0IExpYnJhcmllcyBhbmQgcmVhZCBpbiBkYXRhXSgjaW1wb3J0KQoyLiBbRGVzY3JpcHRpdmUgU3RhdGlzdGljc10oI2Rlc3N0YXQpCjMuIFtDbGVhbmluZy9QcmVwYXJhdGlvbl0oI2NsZWFuKQoKIyMjIyMjIFZpc3VhbGl6YXRpb25zOgo0LiBbVGltZSBTZXJpZXMgUGxvdHNdKCN0aW1lKQo1LiBbU3VtbWFyeSBQbG90c10oI3N1bSkKCiMjIyMjIyBDb25jbHVzaW9uczoKNi4gW1QtdGVzdHNdKCN0MSkKICAgICsgW092ZXJhbGxdKCN0MSkKICAgICsgW0luZGl2aWR1YWwgU3Rvcm1zXSgjdDIpCjcuIFtUaW1lIFNlcmllcyBBbmFseXNpc10oI3RpbWVhbmFsKQo4LiBbUHJlZGljdGl2ZSBNb2RlbGxpbmddKCNwcmVkaWN0KQoKIyMjIyMjIEV4dHJhczoKNy4gW0NyZWF0aW5nIG91ciBjc3ZdKCNjc3YpCgoqKiogCiMgPGEgbmFtZT0iaW1wb3J0Ij48L2E+CiMjIyMjIyBbYmFjayB0byBuYXZpZ2F0aW9uXSgjbmF2KQojIEltcG9ydCBsaWJyYXJpZXMgYW5kIHJlYWQgaW4gZGF0YSAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShybGlzdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodHJhbnNmb3JtcikKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkoeHRhYmxlKQoKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIHNjaXBlbj05OTk5OSkKCiMgd2VhdGhlckZ1bGwganVzdCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgdGhpcyBub3RlYm9vayAucm1iIGZpbGUKZnVsbCA8LSByZWFkLmNzdignd2VhdGhlckZ1bGwuY3N2JykKYGBgCgoqKioKIyA8YSBuYW1lPSJkZXNzdGF0Ij48L2E+CiMjIyMjIyBbYmFjayB0byBuYXZpZ2F0aW9uXSgjbmF2KQojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKYGBge3J9CmhlYWQoZnVsbCkKZGltKGZ1bGwpCnN1bW1hcnkoZnVsbFssMToyNl0pCnN1bW1hcnkoZnVsbFssMjc6NTJdKQpsZW5ndGgodW5pcXVlKGZ1bGwkRVZFTlRfVFlQRSkpCmBgYAoKKioqCiMgPGEgbmFtZT0iY2xlYW4iPjwvYT4KIyMjIyMjIFtiYWNrIHRvIG5hdmlnYXRpb25dKCNuYXYpCiMgQ2xlYW5pbmcvUHJlcGFyYXRpb24KIyMjIHNlcGVyYXRlIEJFR0lOX1lFQVJNT05USCB1c2luZyBhICItIiBhbmQgY3JlYXRlIG5ldyB2YXJpYWJsZSBZTUQgdGhhdCBjb250YWlucyB0aGUgeWVhciBtb250aCBhbmQgZGF5IHNlcGVyYXRlZCBieSBhICItIgpgYGB7cn0KZnVsbCRCRUdJTl9ZRUFSTU9OVEggPC0gZ3N1YigiKFxcZHs0fSkoXFxkezJ9KSIsICJcXDEtXFwyIiwgZnVsbCRCRUdJTl9ZRUFSTU9OVEgpCmZ1bGwkWU1EIDwtIHBhc3RlKGZ1bGwkQkVHSU5fWUVBUk1PTlRILCBmdWxsJEJFR0lOX0RBWSwgc2VwPSItIikKaGVhZChmdWxsKQpgYGAKCiMjIyBDbGVhbiB1cCBEQU1BR0VfUFJPUEVSVFkgY29sdW1uIHNvIGl0IGNhbiBiZSB1c2VkIG51bWVyaWNhbGx5IGFuZCBzYXZlIGFzIG5ldyB2YXJpYWJsZQpgYGB7cn0KeGluMSA8LSB4aW4yIDwtIHhpbjMgPC0gcmVwKE5BLHRpbWVzPWxlbmd0aChmdWxsJERBTUFHRV9QUk9QRVJUWSkpCgoKZm9yIChpIGluIDE6bGVuZ3RoKGZ1bGwkREFNQUdFX1BST1BFUlRZKSl7CiAgaWYgKGdyZXBsKCJLIixmdWxsJERBTUFHRV9QUk9QRVJUWVtpXSk9PVQpewogICAgeGluMVtpXSA8LSBzdWIoIksiLCIiLGZ1bGwkREFNQUdFX1BST1BFUlRZW2ldKQogIH0KICBpZiAoZ3JlcGwoIk0iLGZ1bGwkREFNQUdFX1BST1BFUlRZW2ldKT09VCl7CiAgICB4aW4yW2ldIDwtIHN1YigiTSIsIiIsZnVsbCREQU1BR0VfUFJPUEVSVFlbaV0pCiAgfQp9CnhpbjEgPC0gYXMubnVtZXJpYyh4aW4xKQp4aW4yIDwtIGFzLm51bWVyaWMoeGluMikKeGluMSA8LSB4aW4xICogMTAwMAp4aW4yIDwtIHhpbjIgKiAxMDAwMDAwCnhpbjFbaXMubmEoeGluMSldIDwtIDAKeGluMltpcy5uYSh4aW4yKV0gPC0gMAoKeGluMyA8LSB4aW4xICsgeGluMgpmdWxsJERBTUFHRV9QUk9QRVJUWV9DTEVBTiA8LSB4aW4zCmhlYWQoZnVsbCkKYGBgCgojIyMgQWRqdXN0IERBTUFHRV9QUk9QRVJUWV9DTEVBTiBjb2x1bW4gZm9yIGluZmxhdGlvbgpgYGB7cn0KIyAgIHVzaW5nIHF1YW50bW9kIHBhY2thZ2UgdG8gYWNjZXNzIGNvbnN1bWVyIHByaWNlIGluZGV4IGRhdGEKZ2V0U3ltYm9scygiQ1BJQVVDU0wiLCBzcmM9J0ZSRUQnKQpjcGkgPC0gQ1BJQVVDU0wKCmNwaU1vbnRocyA8LSBzdWJzdHIoaW5kZXgoY3BpKSwgMSwgNykKCmNwaWRmIDwtIGRhdGEuZnJhbWUoIm1vbnRocyIgPSBjcGlNb250aHMsICJjcGkiID0gY3BpKQpuYW1lcyhjcGlkZikgPC0gYygibW9udGhzIiwgIkNQSSIpCgpmdWxsIDwtIG1lcmdlKGZ1bGwsIGNwaWRmLCBieS54PSAiQkVHSU5fWUVBUk1PTlRIIiwgYnkueT0gIm1vbnRocyIpCgojIG91ciBkYXRhc2V0IGhhcyB0aGUgbW9zdCByZWNlbnQgc3Rvcm0gcmVjb3JkZWQgYmVpbmcgaW4ganVseSB3aGVuIHRoZSAKIyBjcGkgd2FzIDI1NSBzbyB3ZSBhcmUgZ3JhYmJpbmcgdGhlIGNwaSBhcyBvZiBvY3QgMXN0IChtb3N0IHJlY2VudCBmb3IgdG9kYXlzIGRvbGxhcikKY3BpdG9kYXkgPC0gdGFpbChjcGksIDEpCgpmdWxsJG11bHRGYWN0b3IgPC0gYXMudmVjdG9yKGNwaXRvZGF5KSAvIGZ1bGwkQ1BJIAoKZnVsbCRBREpfREFNQUdFX1BST1BFUlRZIDwtIGZ1bGwkREFNQUdFX1BST1BFUlRZX0NMRUFOICogZnVsbCRtdWx0RmFjdG9yCmhlYWQoZnVsbCkKYGBgCgoqKioKIyA8YSBuYW1lPSJ0aW1lIj48L2E+CiMjIyMjIyBbYmFjayB0byBuYXZpZ2F0aW9uXSgjbmF2KQojIFRpbWUgU2VyaWVzIFBsb3RzCiMjIyBEaXJlY3QgRGVhdGhzIGJ5IE1vbnRoCiMjIyMjIG9uZSBvdXRsaWVyIHRoYXQgd2FzIG92ZXIgMTAwMCByZW1vdmVkCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9CmRfYnlfbSA8LSBhZ2dyZWdhdGUoIERFQVRIU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZnVsbCApCm5hbWVzKGRfYnlfbSkgPC0gYygiQkVHSU5fWUVBUk1PTlRIIiwgIkRFQVRIU19ESVJFQ1QiKQoKd2luZHNvciA8LSBzdWJzZXQoZF9ieV9tLCBERUFUSFNfRElSRUNUIDwgNzUwKQoKbiA8LSAyMApudW1yb3cgPC0gbnJvdyhkX2J5X20pL24Kc2VxMSA8LSBzZXEoZnJvbT1udW1yb3csIHRvPW51bXJvdypuLTEsIGJ5PW51bXJvdykKCmdncGxvdCh3aW5kc29yLCBhZXMoQkVHSU5fWUVBUk1PTlRILCBERUFUSFNfRElSRUNUKSkrCiAgZ2VvbV9wb2ludChzaXplPS44KSsKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9IlllYXItTW9udGgiLCBicmVha3M9d2luZHNvciRCRUdJTl9ZRUFSTU9OVEhbc2VxMV0pKwogIGdndGl0bGUoIkRpcmVjdGx5IFJlbGF0ZWQgRGVhdGhzIGJ5IE1vbnRoIG92ZXIgNzAgeWVhcnMiLCBzdWJ0aXRsZSA9ICIqb25lIG91dGxpZXIgcmVtb3ZlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgeWxhYigiRGlyZWN0bHkgUmVsYXRlZCBEZWF0aHMiKQpgYGAKCiMjIyBEaXJlY3RseSByZWxhdGVkIGluanVyaWVzIHBlciBtb250aApgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQpkX2J5X20gPC0gYWdncmVnYXRlKCBJTkpVUklFU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZnVsbCApCm5hbWVzKGRfYnlfbSkgPC0gYygiQkVHSU5fWUVBUk1PTlRIIiwgIklOSlVSSUVTX0RJUkVDVCIpCgojICAgY3JlYXRlIGEgc2VxdWVuY2UgZm9yIHBsb3R0aW5nIGEgY2VydGFpbiBudW1iZXIgKG4pIG9mIGRpc2NyZXRlIHggdmFyaWFibGUgZGF0ZXMsIHVzZWQgdG8gaW5kZXggeWVhciBtb250aCBpbiBzY2FsZV94X2Rpc2NyZXRlKCkKbiA8LSAyMApudW1yb3cgPC0gbnJvdyhkX2J5X20pL24Kc2VxMSA8LSBzZXEoZnJvbT1udW1yb3csIHRvPW51bXJvdypuLTEsIGJ5PW51bXJvdykKCiMgICBQTE9UIQpnZ3Bsb3QoZF9ieV9tLCBhZXMoQkVHSU5fWUVBUk1PTlRILCBJTkpVUklFU19ESVJFQ1QpKSsKICBnZW9tX3BvaW50KHNpemU9LjgpKwogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iWWVhci1Nb250aCIsIGJyZWFrcz1kX2J5X20kQkVHSU5fWUVBUk1PTlRIW3NlcTFdKSsKICBnZ3RpdGxlKCJEaXJlY3RseSBSZWxhdGVkIEluanVyaWVzIGJ5IE1vbnRoIG92ZXIgNzAgeWVhcnMiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgeWxhYigiRGlyZWN0bHkgUmVsYXRlZCBJbmp1cmllcyIpCmBgYAoKCiMjIyBEYW1hZ2VkIHByb3BlcnR5IHBlciBtb250aApgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQojICAgYWdncmVnYXRlIGRlYXRocyBieSB5ZWFyIGFuZCBtb250aApkX2J5X20gPC0gYWdncmVnYXRlKCBBREpfREFNQUdFX1BST1BFUlRZIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWZ1bGwgKQpuYW1lcyhkX2J5X20pIDwtIGMoIkJFR0lOX1lFQVJNT05USCIsICJBREpfREFNQUdFX1BST1BFUlRZIikKCiMgICBjcmVhdGUgYSBzZXF1ZW5jZSBmb3IgcGxvdHRpbmcgYSBjZXJ0YWluIG51bWJlciAobikgb2YgZGlzY3JldGUgeCB2YXJpYWJsZSBkYXRlcywgdXNlZCB0byBpbmRleCB5ZWFyIG1vbnRoIGluIHNjYWxlX3hfZGlzY3JldGUoKQpuIDwtIDIwCm51bXJvdyA8LSBucm93KGRfYnlfbSkvbgpzZXExIDwtIHNlcShmcm9tPW51bXJvdywgdG89bnVtcm93Km4tMSwgYnk9bnVtcm93KQoKIyAgIFBMT1QhCmdncGxvdChkX2J5X20sIGFlcyhCRUdJTl9ZRUFSTU9OVEgsIEFESl9EQU1BR0VfUFJPUEVSVFkpKSsKICBnZW9tX3BvaW50KHNpemU9LjgpKwogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iWWVhci1Nb250aCIsIGJyZWFrcz1kX2J5X20kQkVHSU5fWUVBUk1PTlRIW3NlcTFdKSsKICBnZ3RpdGxlKCJQcm9wZXJ0eSBEYW1hZ2UgYnkgTW9udGggb3ZlciA3MCB5ZWFycyIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICB5bGFiKCJBZGp1c3RlZCBmb3IgSW5mbGF0aW9uIERhbWFnZSB0byBQcm9wZXJ0eSAoJCkiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9Y29tbWEpCmBgYAoKIyMjIE1vc3QgZGFuZ2Vyb3VzIHN0b3JtIGRlYXRocyBieSBkYXkKIyMjIyMgaGVyZSB3ZSBjYW4gdmVyeSBjbGVhcmx5IHNlZSB0aGF0IHRoZXkgc3RhcnRlZCByZWNvcmRpbmcgY2VydGFpbiB0eXBlcyBvZiBzdG9ybXMgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQojICAgc2VsZWN0IHJlbGV2YW50IGNvbHVtbnMKY29scyA8LSBjKCJZTUQiLCAiREVBVEhTX0RJUkVDVCIsICJFVkVOVF9UWVBFIiwgIllFQVIiKQp3b3JrIDwtIGZ1bGxbLGNvbHNdCgojICAgZ2V0IG1vc3QgZGFuZ2Vyb3VzIHR5cGVzIG9mIHN0b3JtcyBoYXZpbmcgREVBVEhTX0RJUkVDVCA+IHRoaXJkIHF1YXJ0aWxlCmVfYnlfZCA8LSBhZ2dyZWdhdGUoREVBVEhTX0RJUkVDVCB+IEVWRU5UX1RZUEUsIEZVTiA9IHN1bSwgZGF0YT1mdWxsKQpzdWIgPC0gc3Vic2V0KGVfYnlfZCwgREVBVEhTX0RJUkVDVCA+IDUwKSAKCiMgICBmaWx0ZXIgYnkgbW9zdCBkYW5nZXJvdXMgc3Rvcm0gZm91bmQgYWJvdmUKIyAgIERFQVRIU19ESVJFQ1QgPCAxMDAgcmVtb3ZlcyBvbmUgb3V0bGllciB0aGF0IGFmZmVjdHMgYWxsIG9mIHRoZSBncmFwaHMgaW4gdGhlIGZhY2V0IHdyYXAgc28gSSByZW1vdmVkIGl0Cm5ldyA8LSBzdWJzZXQod29yaywgRVZFTlRfVFlQRSAlaW4lIHN1YiRFVkVOVF9UWVBFICYgREVBVEhTX0RJUkVDVCA8IDEwMCkgICAKCmdncGxvdChuZXcsIGFlcyhZTUQsIERFQVRIU19ESVJFQ1QpKSsKICBnZW9tX3BvaW50KHNpemU9LjUpKwogIGZhY2V0X3dyYXAodmFycyhuZXckRVZFTlRfVFlQRSkpKwogIGdndGl0bGUoIkRlYXRocyBPdmVyIFRpbWUgZm9yIE1vc3QgRGFuZ2Vyb3VzIFR5cGVzIG9mIEV2ZW50cyIpKwogIHhsYWIoIlllYXItTW9udGgtRGF5IikrCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIEJhcnBsb3RzIG9mIGRpcmVjdGx5IHJlbGF0ZWQgZGVhdGhzIGJ5IHN0b3JtIHR5cGUgZm9yIGV2ZXJ5IHllYXIgaW4gdGhlIGRhdGEgc2V0CiMjIyMjIHNhdmVkIGFzIHR3byBzZXBlcmF0ZSBsYXJnZSBwZGZzIGZvciB2aWV3YWJpbGl0eQpgYGB7ciBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9OH0KIyAgIGFnZ3JlZ2F0ZSBmdWxsIGRhdGFzZXQgYnkgeWVhciBhbmQgZXZlbnQgdHlwZSBmaW5kaW5nIHRoZSBzdW0gb2YgZGlyZWN0bHkgcmVsYXRlZCBkZWF0aHMKYWdnIDwtIGFnZ3JlZ2F0ZShERUFUSFNfRElSRUNUIH4gWUVBUiArIEVWRU5UX1RZUEUsIEZVTj1zdW0sIGRhdGE9ZnVsbCkKYWdnIDwtIGFnZ1tvcmRlcihhZ2ckWUVBUiksXQoKIyAgIGNyZWF0ZSB5ZWFyIHNlcXVlbmNlcwpzZXExIDwtIDE5NTA6MTk5NQpzZXEyIDwtIDE5OTY6MjAxOQoKZmlyc3RTZXQgPC0gYWdnW2FnZyRZRUFSICVpbiUgc2VxMSxdCnNlY29uZFNldCA8LSBhZ2dbYWdnJFlFQVIgJWluJSBzZXEyLF0KCiMgICBTaW5jZSBhIGJ1bmNoIG9mIG5ldyBFVkVOVF9UWVBFUyB3ZXJlIGFkZGVkIGFyb3VuZCAxOTU1IHRoZXJlIHdlcmUgYSBsb3Qgb2YgZXh0cmEgb25lcyB0aGF0IGhhdmUgMCBkaXJlY3QgZGVhdGhzIGFzc29jaWF0ZWQgd2l0aCB0aGVtIHNvIHRoZXkgd2VyZSBmaWx0ZXJlZCBvdXQgZm9yIHZpZXdpbmcgcHVycG9zZXMuCmZpcnN0U2V0IDwtIHN1YnNldChmaXJzdFNldCwgREVBVEhTX0RJUkVDVCA+IDApCgojICAgdGhpcyBpcyBiYXNlZCBvZmYgb2YgdGhlIDNyZCBxdXJ0aWxlIG9mIERFQVRIU19ESVJFQ1QgYW5kIGlzIG1lYW50IHRvIG5hcnJvdyBpdCBkb3duIHRvIG1vcmUgZGFuZ2Vyb3VzIHR5cGVzIG9mIGV2ZW50cyBiZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IHR5cGVzIG9mIGV2ZW50cyBpdCBpcyBmb3Igdmlld2luZyBwdXJwb3Nlcy4Kc2Vjb25kU2V0IDwtIHN1YnNldChzZWNvbmRTZXQsIERFQVRIU19ESVJFQ1QgPiBzdW1tYXJ5KHNlY29uZFNldCRERUFUSFNfRElSRUNUKVs1XSkKCgojICAgUExPVCEhISEKIyAgIDE5NTAtMTk5NQpnZ3Bsb3QoZmlyc3RTZXQsIGFlcyhFVkVOVF9UWVBFLCBERUFUSFNfRElSRUNUKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpKwogIGNvb3JkX2ZsaXAoKSsKICBmYWNldF93cmFwKHZhcnMoZmlyc3RTZXQkWUVBUikpKwogIGdndGl0bGUoIkRpcmVjdGx5IFJlbGF0ZWQgRGVhdGhzIGJ5IEV2ZW50IFR5cGUiLCBzdWJ0aXRsZSA9ICIxOTUwLTE5OTUiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpKwogIHhsYWIoIkRpcmVjdGx5IFJlbGF0ZWQgRGVhdGhzIikrCiAgeWxhYigiRXZlbnQgVHlwZSIpCgoKZ2dzYXZlKCdkZWF0aHNfYnlfRVZFTlRfVFlQRV8xOTUwLTE5OTUucGRmJykKCiMgICAxOTk2LTIwMTkKIGdncGxvdChzZWNvbmRTZXQsIGFlcyhFVkVOVF9UWVBFLCBERUFUSFNfRElSRUNUKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpKwogIGNvb3JkX2ZsaXAoKSsKICBmYWNldF93cmFwKHZhcnMoc2Vjb25kU2V0JFlFQVIpKSsKICBnZ3RpdGxlKCJEaXJlY3RseSBSZWxhdGVkIERlYXRocyBieSBFdmVudCBUeXBlIiwgc3VidGl0bGUgPSAiMTk5Ni0yMDE5IikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICB4bGFiKCJEaXJlY3RseSBSZWxhdGVkIERlYXRocyIpKwogIHlsYWIoIkV2ZW50IFR5cGUiKQoKZ2dzYXZlKCdkZWF0aHNfYnlfRVZFTlRfVFlQRV8xOTk2LTIwMTkucGRmJykKCmBgYAoKIyMjIEZyZXF1ZW5jeSBvZiBzdG9ybSBldmVudHMgZm9yIGV2ZXJ5IHllYXIgaW4gZGF0YSBzZXQKIyMjIyMgc2F2ZWQgYXMgdHdvIHNlcGVyYXRlIGxhcmdlIHBkZnMgZm9yIHZpZXdhYmlsaXR5CmBgYHtyIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD04fQojICAgdXNlZCB0byBnZXQgdGhlIGNvdW50IG9mIGVhY2ggZXZlbnQgdHlwZSBieSB5ZWFyLCBmcm9tIGRwbHlyIHBhY2thZ2UKYnlZZWFyIDwtIGZ1bGwgJT4lIGNvdW50KFlFQVIsIEVWRU5UX1RZUEUpCgojICAgdGhpcyBpcyB0byBsaW1pdCB0aGUgZ3JhcGggdG8gc3Rvcm1zIHRoYXQgYXJlIG1vc3QgZnJlcXVlbnQgdXNpbmcgdGhlIGZpcnN0IHF1YXJ0aWxlCmJ5WWVhciA8LSBzdWJzZXQoYnlZZWFyLCBuID4gc3VtbWFyeShieVllYXIkbilbMl0pICAKCnNlcTEgPC0gMTk1MDoxOTk1CnNlcTIgPC0gMTk5NjoyMDE5CgpmaXJzdFNldCA8LSBieVllYXJbYnlZZWFyJFlFQVIgJWluJSBzZXExLF0Kc2Vjb25kU2V0IDwtIGJ5WWVhcltieVllYXIkWUVBUiAlaW4lIHNlcTIsXQoKIyAgIHRoZSBzZWNvbmQgc2V0IGNvbnRhaW5zIHNvIG1hbnkgdHlwZXMgb2YgZXZlbnRzIGl0IGhhZCB0byBiZSBsaW1pdGVkIHRvIHN0b3JtcyB0aGF0IGFyZSBtb3N0IGZyZXF1ZW50IHVzaW5nIHRoZSBmaXJzdCBxdWFydGlsZQpzZWNvbmRTZXQgPC0gc3Vic2V0KHNlY29uZFNldCwgbiA+IHN1bW1hcnkoc2Vjb25kU2V0JG4pWzJdKQoKIyAgIFBMT1QhISEhCiMgICAxOTUzLTE5OTUKZ2dwbG90KGZpcnN0U2V0LCBhZXMoRVZFTlRfVFlQRSwgbikpKwogIGdlb21fYmFyKHN0YXQ9J0lkZW50aXR5JykrCiAgY29vcmRfZmxpcCgpKwogIGZhY2V0X3dyYXAodmFycyhmaXJzdFNldCRZRUFSKSkrCiAgZ2d0aXRsZSgiRnJlcXVlbmN5IG9mIEV2ZW50cyBieSBZZWFyIiwgc3VidGl0bGUgPSAiMTk1My0xOTk1IikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICB5bGFiKCJGcmVxdWVuY3kiKSsKICB4bGFiKCJFdmVudCBUeXBlIikKCmdnc2F2ZSgiZXZlbnRfZnJlcXVlbmN5XzE5NTMtMTk5NS5wZGYiKQoKIyAgIDE5OTYtMjAxOQpnZ3Bsb3Qoc2Vjb25kU2V0LCBhZXMoRVZFTlRfVFlQRSwgbikpKwogIGdlb21fYmFyKHN0YXQ9J0lkZW50aXR5JykrCiAgY29vcmRfZmxpcCgpKwogIGZhY2V0X3dyYXAodmFycyhzZWNvbmRTZXQkWUVBUikpKwogIGdndGl0bGUoIkZyZXF1ZW5jeSBvZiBFdmVudHMgYnkgWWVhciIsIHN1YnRpdGxlID0gIjE5OTYtMjAxOSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgeWxhYigiRnJlcXVlbmN5IikrCiAgeGxhYigiRXZlbnQgVHlwZSIpCgpnZ3NhdmUoImV2ZW50X2ZyZXF1ZW5jeV8xOTk2LTIwMTkucGRmIikKCmBgYAoKKioqCiMjIyMjIyBbYmFjayB0byBuYXZpZ2F0aW9uXSgjbmF2KQojIDxhIG5hbWU9InN1bSI+PC9hPgojIFN1bW1hcnkgcGxvdHMKIyMjIE1vc3QgZGFuZ2Vyb3VzIHR5cGVzIG9mIGV2ZW50cyBpbiB0ZXJtcyBvZiBkaXJlY3RseSByZWxhdGVkIGRlYXRocwojIyMjIyBUaGVyZSBhcmUgc28gbWFueSB0eXBlcyBvZiBzdG9ybXMgdGhpcyBkYXRhIGhhZCB0byBiZSBzdWJzZXQgdG8gc2hvdyB0aGUgdG9wIG1vc3QgZGFuZ2Vyb3VzIGNsZWFybHkKYGBge3J9CmVfYnlfZCA8LSBhZ2dyZWdhdGUoREVBVEhTX0RJUkVDVCB+IEVWRU5UX1RZUEUsIEZVTiA9IHN1bSwgZGF0YT1mdWxsKQpzdWIgPC0gc3Vic2V0KGVfYnlfZCwgREVBVEhTX0RJUkVDVCA+IDIwMCkgICMgYXJiaXRyYXJ5IGN1dG9mZiBwb2ludAoKZ2dwbG90KHN1YiwgYWVzKHJlb3JkZXIoRVZFTlRfVFlQRSwgREVBVEhTX0RJUkVDVCksIERFQVRIU19ESVJFQ1QpKSsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykrCiAgZ2d0aXRsZSgiTW9zdCBEYW5nZXJvdXMgRXZlbnRzIGluIFRlcm1zIG9mIERlYXRocyIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsKICB5bGFiKCJEaXJlY3RseSBSZWxhdGVkIERlYXRocyIpKwogIHhsYWIoIkV2ZW50IFR5cGVzIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWNvbW1hKSsKICBjb29yZF9mbGlwKCkKYGBgCgoKYGBge3J9CmVfYnlfZCA8LSBhZ2dyZWdhdGUoSU5KVVJJRVNfRElSRUNUIH4gRVZFTlRfVFlQRSwgRlVOID0gc3VtLCBkYXRhPWZ1bGwpCnN1YiA8LSBzdWJzZXQoZV9ieV9kLCBJTkpVUklFU19ESVJFQ1QgPiBtZWFuKGVfYnlfZCRJTkpVUklFU19ESVJFQ1QpKSAgCgpnZ3Bsb3Qoc3ViLCBhZXMocmVvcmRlcihFVkVOVF9UWVBFLCBJTkpVUklFU19ESVJFQ1QpLCBJTkpVUklFU19ESVJFQ1QpKSsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykrCiAgZ2d0aXRsZSgiTW9zdCBEYW5nZXJvdXMgRXZlbnRzIGluIFRlcm1zIG9mIEluanVyaWVzIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIHBsb3QubWFyZ2luID0gbWFyZ2luKDEwLCAxNSwgMTAsIDEwKSkrCiAgeWxhYigiRGlyZWN0bHkgUmVsYXRlZCBJbmp1cmllcyIpKwogIHhsYWIoIkV2ZW50IFR5cGVzIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWNvbW1hKSsKICBjb29yZF9mbGlwKCkKYGBgCgoKIyMjIE1vc3QgQ29zdGx5IEV2ZW50cyBpbiB0ZXJtcyBvZiBwcm9wZXJ0eSBkYW1hZ2UKIyMjIyMgc3Vic2V0IGJhc2VkIG9uIHRoZSBtZWFuIGZvciB2aWV3YWJpbGl0eQpgYGB7cn0KZV9ieV9kIDwtIGFnZ3JlZ2F0ZShBREpfREFNQUdFX1BST1BFUlRZIH4gRVZFTlRfVFlQRSwgRlVOID0gc3VtLCBkYXRhPWZ1bGwpCnN1YiA8LSBzdWJzZXQoZV9ieV9kLCBBREpfREFNQUdFX1BST1BFUlRZID4gbWVhbihlX2J5X2QkQURKX0RBTUFHRV9QUk9QRVJUWSkpICAKCmdncGxvdChzdWIsIGFlcyhyZW9yZGVyKEVWRU5UX1RZUEUsIEFESl9EQU1BR0VfUFJPUEVSVFkpLCBBREpfREFNQUdFX1BST1BFUlRZKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpKwogIGdndGl0bGUoIk1vc3QgQ29zdGx5IEV2ZW50cyBpbiB0ZXJtcyBvZiBQcm9wZXJ0eSBEYW1hZ2UiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgeWxhYigiUHJvcGVydHkgRGFtYWdlIEFkanVzdGVkIGZvciBJbmZsYXRpb24gKCQpIikrCiAgeGxhYigiRXZlbnQgVHlwZXMiKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9Y29tbWEpKwogIGNvb3JkX2ZsaXAoKQpgYGAKCgojIyMgU3Rvcm0gRXZlbnRzIGJhc2VkIG9uIGZyZXF1ZW5jeQpgYGB7cn0KIyAgIG9idGFpbiBjb3VudHMgYW5kIHN1YnNldCBvdXQgaW5mcmVxdWVudCBldmVudHMgdXNpbmcgbWVhbiwgYWdhaW4gZHBseXIgcGFja2FnZQpldmVudCA8LSBmdWxsICU+JSBjb3VudChFVkVOVF9UWVBFKQpldmVudCA8LSBzdWJzZXQoZXZlbnQsIG4gPj0gbWVhbihldmVudCRuKSkgCgojICAgUExPVCEhISEKZ2dwbG90KGV2ZW50LCBhZXMocmVvcmRlcihFVkVOVF9UWVBFLCBuKSwgbikpKwogIGdlb21fYmFyKHN0YXQ9J0lkZW50aXR5JykrCiAgZ2d0aXRsZSgiRnJlcXVlbmN5IG9mIEV2ZW50cyBmb3IgdGhlIFBhc3QgNzAgWWVhcnMiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrCiAgeWxhYigiRnJlcXVlbmN5IikrCiAgeGxhYigiRXZlbnQgVHlwZXMiKSsKICBjb29yZF9mbGlwKCkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICAgIyBmb3JjZXMgZ2dwbG90IHRvIHN0b3AgdXNpbmcgc2NpZW50aWZpYyBub3RhdGlvbiBmb3IgeS1heGlzCmBgYAoKIyMjIFBpZSBjaGFydCBvZiBkaXJlY3RseSByZWxhdGVkIGRlYXRocyBieSBzdGF0ZQpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQp0aWJfZGF0YSA8LSBhc190aWJibGUoZnVsbCkKCiMgY2xlYW4gc3RhdGUgdGliX2RhdGEKbmV3ZGF0YSA8LSBzdWJzZXQodGliX2RhdGEgJT4lIHNlbGVjdCAoU1RBVEUsIERFQVRIU19ESVJFQ1QpLCBTVEFURSAlaW4lIHRvdXBwZXIoc3RhdGUubmFtZSkpCgojIHJhbmsgc3RhdGUgaW4gdGVybXMgb2YgZGVhdGgKZGFuZ19zdGF0ZSA8LSBhZ2dyZWdhdGUoREVBVEhTX0RJUkVDVH5TVEFURSwgZGF0YT1uZXdkYXRhLCBzdW0pCmRhbmdfc3RhdGUkZGFuZ19yYW5rIDwtIHJhbmsoLWRhbmdfc3RhdGUkREVBVEhTX0RJUkVDVCwgdGllcy5tZXRob2Q9J21pbicsKQoKZGFuZ19zdGF0ZSA8LSBkYW5nX3N0YXRlW29yZGVyKGRhbmdfc3RhdGUkZGFuZ19yYW5rKSxdCgojIHN1YnNldCBzdGF0ZXMgd2l0aCBsZXNzIHRoYW4gMTAwIGRlYXRocwphYm92ZTEwMCA8LSBzdWJzZXQoZGFuZ19zdGF0ZSwgZGFuZ19zdGF0ZSRERUFUSFNfRElSRUNUID4gMTAwKQoKIyByc3R1ZGlvIHBpZSBjaGFydApwaWUoYWJvdmUxMDAkREVBVEhTX0RJUkVDVCwgbGFiZWxzPWRhbmdfc3RhdGUkU1RBVEUsIGNleD0wLjYsIG1haW4gPSdUb3RhbCBBbW91bnQgb2YgRGlyZWN0IERlYXRoIHBlciBTdGF0ZSwgMTk1MCAtIDIwMTknKQoKIyBnZ3Bsb3QgcGllIGNoYXJ0CnBpZXBpZSA8LSBnZ3Bsb3QoZGFuZ19zdGF0ZSwgYWVzKHg9IiIsIHk9ZGFuZ19zdGF0ZSRERUFUSFNfRElSRUNULGZpbGw9ZGFuZ19zdGF0ZSRERUFUSFNfRElSRUNUKSkKCmFib3ZlMTAwJHByb2IgPC0gYWJvdmUxMDAkREVBVEhTX0RJUkVDVCAvIHN1bShhYm92ZTEwMCRERUFUSFNfRElSRUNUKSAqIDEwMAoKZ2dwbG90KGFib3ZlMTAwLCBhZXMoeD0iIiwgeT1wcm9iLCBmaWxsPVNUQVRFKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9MSkgKwogIGNvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkKCmBgYAoKKioqCiMjIyMjIyBbYmFjayB0byBuYXZpZ2F0aW9uXSgjbmF2KQojIDxhIG5hbWU9InQxIj48L2E+CiMgdC50ZXN0cyBiZXR3ZWVuIDE5OTYtMjAwOCBhbmQgMjAwOS0yMDE5IGFnZ3JlZ2F0ZWQgYnkgWWVhci1Nb250aAojIyMjIyBOT0FBIG9ubHkgY29sbGVjdGVkIGRhdGEgb24gdGhyZWUgdHlwZXMgb2Ygc2V2ZXJlIHN0b3JtcyB1bnRpbCAxOTk2IHNvIGluIG9yZGVyIHRvIGNvbXBhcmUgcGFzdCBkYXRhIHRvIG1vcmUgcmVjZW50IGRhdGEgd2UgaGFkIHRvIGNob29zZSBhIGRhdGUgcmFuZ2UgdGhhdCBjb250YWluZWQgdGhlIHNhbWUgdHlwZXMgb2Ygc3Rvcm1zCgojIyMjIyBTZXBlcmF0ZSBkYXRhIGludG8gdHdvIHNldHMgb2YgeWVhcnMgdGhhdCBjb250YWluIHNpbWlsYXIgdHlwZXMgb2YgZXZlbnRzCmBgYHtyfQp5cnMxIDwtIDE5OTY6MjAwNwp5cnMyIDwtIDIwMDg6MjAxOQoKZWFybHkgPC0gZnVsbFtmdWxsJFlFQVIgJWluJSB5cnMxLF0KbGF0ZSA8LSBmdWxsW2Z1bGwkWUVBUiAlaW4lIHlyczIsXQoKZF9lYXJseSA8LSBhZ2dyZWdhdGUoIERFQVRIU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZWFybHkgKQpkX2xhdGUgPC0gYWdncmVnYXRlKCBERUFUSFNfRElSRUNUIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWxhdGUgKQoKaV9lYXJseSA8LSBhZ2dyZWdhdGUoIElOSlVSSUVTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1lYXJseSApCmlfbGF0ZSA8LSBhZ2dyZWdhdGUoIElOSlVSSUVTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1sYXRlICkKCnBfZWFybHkgPC0gYWdncmVnYXRlKCBBREpfREFNQUdFX1BST1BFUlRZIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWVhcmx5ICkKcF9sYXRlIDwtIGFnZ3JlZ2F0ZSggQURKX0RBTUFHRV9QUk9QRVJUWSB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1sYXRlICkKCgojIGNoZWNrIHRoYXQgdGhlcmUgaXMgYSBzaW1pbGFyIGFtb3VudCBpbiBlYWNoIHN1YnNldCBvZiBkYXRhLCB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lICMgb2Ygcm93cwpucm93KGRfZWFybHkpCm5yb3coZF9sYXRlKQpgYGAKCiMjIyB0LnRlc3Qgb2YgZGlyZWN0bHkgcmVsYXRlZCBkZWF0aHMgYWdncmVnYXRlZCBieSB5ZWFyLW1vbnRoCiMjIyMjIEgwID0gdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiBkaXJlY3RseSByZWxhdGVkIGRlYXRocyBiZXR3ZWVuIHRoZSB0d28gZGF0ZSByYW5nZXMsIAojIyMjIyBIQSA9IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBkaXJlY3RseSByZWxhdGVkIGRlYXRocyBiZXR3ZWVuIHRoZSB0d28gZGF0ZSByYW5nZXMKYGBge3J9Cmhpc3QoZF9lYXJseSRERUFUSFNfRElSRUNUKQpoaXN0KGRfbGF0ZSRERUFUSFNfRElSRUNUKQoKdC50ZXN0KGRfZWFybHkkREVBVEhTX0RJUkVDVCwgZF9sYXRlJERFQVRIU19ESVJFQ1QpCmBgYAoKIyMjIHQudGVzdCBvZiBkaXJlY3RseSByZWxhdGVkIGRlYXRocyBhZ2dyZWdhdGVkIGJ5IHllYXItbW9udGgsIG91dGxpZXJzIHJlbW92ZWQuCiMjIyMjIGRvZXNuJ3QgY2hhbmdlIHRoZSBjb25jbHVzaW9uIGp1c3QgbWFrZXMgaXQgbGVzcyBzaWduaWZpY2FudCBhcyBvbmUgd291bGQgZXhwZWN0LgpgYGB7cn0KdGhyZXNoIDwtIDEwMAoKZF9lYXJseU91dCA8LSBzdWJzZXQoZWFybHksIERFQVRIU19ESVJFQ1QgPCB0aHJlc2gpCmRfbGF0ZU91dDwtIHN1YnNldChsYXRlLCBERUFUSFNfRElSRUNUIDwgdGhyZXNoKQoKZF9lYXJseSA8LSBhZ2dyZWdhdGUoIERFQVRIU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZF9lYXJseU91dCApCmRfbGF0ZSA8LSBhZ2dyZWdhdGUoIERFQVRIU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZF9sYXRlT3V0ICkKCnN1bW1hcnkoZF9lYXJseSRERUFUSFNfRElSRUNUKQpzdW1tYXJ5KGRfbGF0ZSRERUFUSFNfRElSRUNUKQoKaGlzdChkX2Vhcmx5JERFQVRIU19ESVJFQ1QpCmhpc3QoZF9sYXRlJERFQVRIU19ESVJFQ1QpCgp0LnRlc3QoZF9lYXJseSRERUFUSFNfRElSRUNULCBkX2xhdGUkREVBVEhTX0RJUkVDVCkKYGBgCgojIyMgdC50ZXN0IG9mIGRpcmVjdGx5IHJlbGF0ZWQgaW5qdXJpZXMgYWdncmVnYXRlZCBieSB5ZWFyLW1vbnRoCiMjIyMjIEgwID0gdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiBkaXJlY3RseSByZWxhdGVkIGluanVyaWVzIGJldHdlZW4gdGhlIHR3byBkYXRlIHJhbmdlcywgCiMjIyMjIEhBID0gdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGRpcmVjdGx5IHJlbGF0ZWQgaW5qdXJpZXMgYmV0d2VlbiB0aGUgdHdvIGRhdGUgcmFuZ2VzCmBgYHtyfQpoaXN0KGlfZWFybHkkSU5KVVJJRVNfRElSRUNUKQpoaXN0KGlfbGF0ZSRJTkpVUklFU19ESVJFQ1QpCgp0LnRlc3QoaV9lYXJseSRJTkpVUklFU19ESVJFQ1QsIGlfbGF0ZSRJTkpVUklFU19ESVJFQ1QpCmBgYAoKIyMjIHQudGVzdCBvZiBkaXJlY3RseSByZWxhdGVkIGluanVyaWVzLCBvdXRsaWVycyByZW1vdmVkCmBgYHtyfQp0aHJlc2ggPC0gNjAwCgppX2Vhcmx5T3V0IDwtIHN1YnNldChlYXJseSwgSU5KVVJJRVNfRElSRUNUIDwgdGhyZXNoKQppX2xhdGVPdXQ8LSBzdWJzZXQobGF0ZSwgSU5KVVJJRVNfRElSRUNUIDwgdGhyZXNoKQoKaV9lYXJseSA8LSBhZ2dyZWdhdGUoIElOSlVSSUVTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1pX2Vhcmx5T3V0ICkKaV9sYXRlIDwtIGFnZ3JlZ2F0ZSggSU5KVVJJRVNfRElSRUNUIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWlfbGF0ZU91dCApCgpzdW1tYXJ5KGlfZWFybHkkSU5KVVJJRVNfRElSRUNUKQpzdW1tYXJ5KGlfbGF0ZSRJTkpVUklFU19ESVJFQ1QpCgpoaXN0KGlfZWFybHkkSU5KVVJJRVNfRElSRUNUKQpoaXN0KGlfbGF0ZSRJTkpVUklFU19ESVJFQ1QpCgp0LnRlc3QoaV9lYXJseSRJTkpVUklFU19ESVJFQ1QsIGlfbGF0ZSRJTkpVUklFU19ESVJFQ1QpCmBgYAoKCiMjIyB0LnRlc3Qgb2YgZGFtYWdlZCBwcm9wZXJ0eSBhZ2dyZWdhdGVkIGJ5IHllYXItbW9udGgKIyMjIyMgSDAgPSB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIGRhbWFnZWQgcHJvcGVydHkgYmV0d2VlbiB0aGUgdHdvIGRhdGUgcmFuZ2VzLCAKIyMjIyMgSEEgPSB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gZGFtYWdlZCBwcm9wZXJ0eSBiZXR3ZWVuIHRoZSB0d28gZGF0ZSByYW5nZXMKYGBge3J9Cmhpc3QocF9lYXJseSRBREpfREFNQUdFX1BST1BFUlRZKQpoaXN0KHBfbGF0ZSRBREpfREFNQUdFX1BST1BFUlRZKQoKdC50ZXN0KHBfZWFybHkkQURKX0RBTUFHRV9QUk9QRVJUWSwgcF9sYXRlJEFESl9EQU1BR0VfUFJPUEVSVFkpCmBgYAoKIyMjIHQudGVzdCBvZiBkYW1hZ2VkIHByb3BlcnR5LCBvdXRsaWVycyByZW1vdmVkCmBgYHtyfQp0aHJlc2ggPC0gMTAwMDAwMDAwMAoKcF9lYXJseU91dCA8LSBzdWJzZXQoZWFybHksIEFESl9EQU1BR0VfUFJPUEVSVFkgPCB0aHJlc2gpCnBfbGF0ZU91dDwtIHN1YnNldChsYXRlLCBBREpfREFNQUdFX1BST1BFUlRZIDwgdGhyZXNoKQoKcF9lYXJseSA8LSBhZ2dyZWdhdGUoIEFESl9EQU1BR0VfUFJPUEVSVFkgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9cF9lYXJseU91dCApCnBfbGF0ZSA8LSBhZ2dyZWdhdGUoIEFESl9EQU1BR0VfUFJPUEVSVFkgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9cF9sYXRlT3V0ICkKCnN1bW1hcnkocF9lYXJseSRBREpfREFNQUdFX1BST1BFUlRZKQpzdW1tYXJ5KHBfbGF0ZSRBREpfREFNQUdFX1BST1BFUlRZKQoKaGlzdChwX2Vhcmx5JEFESl9EQU1BR0VfUFJPUEVSVFkpCmhpc3QocF9sYXRlJEFESl9EQU1BR0VfUFJPUEVSVFkpCgp0LnRlc3QocF9lYXJseSRBREpfREFNQUdFX1BST1BFUlRZLCBwX2xhdGUkQURKX0RBTUFHRV9QUk9QRVJUWSkKYGBgCgoqKioKIyMjIyMjIFtiYWNrIHRvIG5hdmlnYXRpb25dKCNuYXYpCiMgPGEgbmFtZT0idDIiPjwvYT4KIyMjIHQudGVzdHMgb2YgaW5kaXZpZHVhbCBzdG9ybXMgY29tcGFyaW5nIGRpcmVjdGx5IHJlbGF0ZWQgZGVhdGhzLCBpbmp1cmllcywgYW5kIHByb3BlcnR5IGRhbWFnZQojIyMjIyBIMCA9IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gZGlyZWN0bHkgcmVsYXRlZCBkZWF0aHMsIGluanVyaWVzLCBvciBwcm9wZXJ0eSBkYW1hZ2UgYmV0d2VlbiB0aGUgdHdvIGRhdGUgcmFuZ2VzCiMjIyMjIEhBID0gdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGRpcmVjdGx5IHJlbGF0ZWQgZGVhdGhzLCBpbmp1cmllcywgb3IgcHJvcGVydHkgZGFtYWdlIGJldHdlZW4gdGhlIHR3byBkYXRlIHJhbmdlcwoKIyMjIyMgd3JpdGUgYSBmdW5jdGlvbiB0byB0LXRlc3QgYSBsaXN0IG9mIGRpZmZlcmVudCBzdG9ybXMgcmVtb3Zpbmcgb3V0bGllcnMgYW5kIGFnZ3JlZ2F0aW5nIGJ5IHllYXItbW9udGgKYGBge3J9CnRlc3Rfc3Rvcm1zIDwtIGZ1bmN0aW9uKGV2ZW50cyl7CiAgCiAgcmV0dXJuX2xpc3QgPC0gcmVwKE5BLCAxKQogIHJldHVybl9jb3VudCA8LSAxCiAgCiAgZF90aHJlc2ggPC0gMTAwCiAgaV90aHJlc2ggPC0gNjAwCiAgcF90aHJlc2ggPC0gMTAwMDAwMDAwMAogIAogIGVhcmx5T3V0IDwtIHN1YnNldChlYXJseSwgQURKX0RBTUFHRV9QUk9QRVJUWSA8IHBfdGhyZXNoICYgSU5KVVJJRVNfRElSRUNUIDwgaV90aHJlc2ggJiBERUFUSFNfRElSRUNUIDwgZF90aHJlc2gpCiAgbGF0ZU91dDwtIHN1YnNldChsYXRlLCBBREpfREFNQUdFX1BST1BFUlRZIDwgcF90aHJlc2ggJiBJTkpVUklFU19ESVJFQ1QgPCBpX3RocmVzaCAmIERFQVRIU19ESVJFQ1QgPCBkX3RocmVzaCkKICAKICBmb3IgKGV2ZW50IGluIGV2ZW50cyl7CiAgICBldmVudEVhcmx5IDwtIHN1YnNldChlYXJseU91dCwgRVZFTlRfVFlQRSA9PSBldmVudCkKICAgIGV2ZW50TGF0ZSA8LSBzdWJzZXQobGF0ZU91dCwgRVZFTlRfVFlQRSA9PSBldmVudCkKICAgIAogICAgZF9ldmVudEVhcmx5IDwtIGFnZ3JlZ2F0ZSggREVBVEhTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1ldmVudEVhcmx5ICkKICAgIGRfZXZlbnRMYXRlIDwtIGFnZ3JlZ2F0ZSggREVBVEhTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1ldmVudExhdGUgKQogICAgCiAgICBpX2V2ZW50RWFybHkgPC0gYWdncmVnYXRlKCBJTkpVUklFU19ESVJFQ1QgfiBCRUdJTl9ZRUFSTU9OVEgsIEZVTj1zdW0sIGRhdGE9ZXZlbnRFYXJseSApCiAgICBpX2V2ZW50TGF0ZSA8LSBhZ2dyZWdhdGUoIElOSlVSSUVTX0RJUkVDVCB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZGF0YT1ldmVudExhdGUgKQogICAgCiAgICBwX2V2ZW50RWFybHkgPC0gYWdncmVnYXRlKCBBREpfREFNQUdFX1BST1BFUlRZIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWV2ZW50RWFybHkgKQogICAgcF9ldmVudExhdGUgPC0gYWdncmVnYXRlKCBBREpfREFNQUdFX1BST1BFUlRZIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBkYXRhPWV2ZW50TGF0ZSApCiAgICAKICAgICMgY2Fubm90IHJlamVjdCBudWxsCiAgICBkX3Rlc3QgPC0gdC50ZXN0KGRfZXZlbnRFYXJseSRERUFUSFNfRElSRUNULCBkX2V2ZW50TGF0ZSRERUFUSFNfRElSRUNUKQogICAgCiAgICAjIGNhbm5vdCByZWplY3QgbnVsbAogICAgaV90ZXN0IDwtIHQudGVzdChpX2V2ZW50RWFybHkkSU5KVVJJRVNfRElSRUNULCBpX2V2ZW50TGF0ZSRJTkpVUklFU19ESVJFQ1QpCiAgICAKICAgICMgY2Fubm90IHJlamVjdCBudWxsCiAgICBwX3Rlc3QgPC0gdC50ZXN0KHBfZXZlbnRFYXJseSRBREpfREFNQUdFX1BST1BFUlRZLCBwX2V2ZW50TGF0ZSRBREpfREFNQUdFX1BST1BFUlRZKQogICAgCiAgICB0ZXN0X2xpc3QgPC0gbGlzdCgiZXZlbnQiID0gZXZlbnQsICJkZWF0aHMiID0gZF90ZXN0LCAiaW5qdXJpZXMiID0gaV90ZXN0LCAicHJvcF9kYW1hZ2UiID0gcF90ZXN0KQogICAgcmV0dXJuX2xpc3QgPC0gbGlzdC5hcHBlbmQocmV0dXJuX2xpc3QsIHRlc3RfbGlzdCkKICB9CiAgcmV0dXJuX2xpc3QgPC0gcmV0dXJuX2xpc3RbIWlzLm5hKHJldHVybl9saXN0KV0KICByZXR1cm4ocmV0dXJuX2xpc3QpCn0KCmBgYAoKIyMjIyMgY3JlYXRlIGxpc3QgYW5kIHVzZSBmdW5jdGlvbgpgYGB7cn0KZXZlbnRzIDwtIGMoIkh1cnJpY2FuZSAoVHlwaG9vbikiLCAiVG9ybmFkbyIsICJIZWF0IiwgIkZsYXNoIEZsb29kIiwgIkZsb29kIiwgCiAgICAgICAgICAgICJUaHVuZGVyc3Rvcm0gV2luZCIsICJIYWlsIiwgIkhpZ2ggV2luZCIsICJXaWxkZmlyZSIsICJMaWdodG5pbmciLCAiUmlwIEN1cnJlbnQiKQp0ZXN0X3N0b3JtcyhldmVudHMpCmBgYAoKIyMjIHQudGVzdHMgb2YgaW5kaXZpZHVhbCBzdG9ybXMgY29tcGFyaW5nIGZyZXF1ZW5jaWVzCiMjIyMjIEgwID0gc3Rvcm1zIGFyZSBub3QgbW9yZSBvciBsZXNzIGZyZXF1ZW50IGJldHdlZW4gdGhlIHR3byBkYXRlIHJhbmdlcwojIyMjIyBIQSA9IHN0b3JtcyBhcmUgbW9yZSBmcmVxdWVudCBpbiBvbmUgb2YgdGhlIGRhdGUgcmFuZ2VzIHRoYW4gdGhlIG90aGVyCgojIyMjIyB3cml0ZSBhIGZ1bmN0aW9uIHRvIHQtdGVzdCBhIGxpc3Qgb2YgZGlmZmVyZW50IHN0b3JtcyBhZ2dyZWdhdGluZyBieSB5ZWFyLW1vbnRoCmBgYHtyfQp0ZXN0X2ZyZXEgPC0gZnVuY3Rpb24oZXZlbnRzKXsKICByZXR1cm5fbGlzdCA8LSByZXAoTkEsMSkKICBmb3IgKGV2ZW50IGluIGV2ZW50cyl7CiAgICBjb2xfbmFtZSA8LSBwYXN0ZShldmVudCwgIl9mcmVxIiwgc2VwPSIiKQogICAgCiAgICBlYXJseVtjb2xfbmFtZV0gPC0gZ3JlcGwoZXZlbnQsIGVhcmx5JEVWRU5UX1RZUEUpCiAgICBsYXRlW2NvbF9uYW1lXSA8LSBncmVwbChldmVudCwgbGF0ZSRFVkVOVF9UWVBFKQogICAgCiAgICBmX2Vhcmx5IDwtIGFnZ3JlZ2F0ZShldmFsKGFzLm5hbWUoY29sX25hbWUpKSB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgZWFybHkpCiAgICBmX2xhdGUgPC0gYWdncmVnYXRlKGV2YWwoYXMubmFtZShjb2xfbmFtZSkpIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBsYXRlKQogICAgCiAgICB0ZXN0X2xpc3QgPC0gbGlzdCgnZXZlbnQnID0gY29sX25hbWUsICd0ZXN0JyA9IHQudGVzdChmX2Vhcmx5WywyXSwgZl9sYXRlWywyXSkpCiAgICByZXR1cm5fbGlzdCA8LSBsaXN0LmFwcGVuZChyZXR1cm5fbGlzdCwgdGVzdF9saXN0KQogIH0KICByZXR1cm5fbGlzdCA8LSByZXR1cm5fbGlzdFshaXMubmEocmV0dXJuX2xpc3QpXQogIHJldHVybihyZXR1cm5fbGlzdCkKfQpgYGAKCiMjIyMjIHVzaW5nIHRoZSBmdW5jdGlvbiB0byB0ZXN0IGxpc3Qgb2Ygc3Rvcm1zIGV4Y2VwdCBodXJyaWNhbmVzCmBgYHtyfQojIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgb2YgcHV0dGluZyBodXJyaWNhbmUgaW50byB0aGUgZGF0YSBzbyB0aGF0IGhhcyB0byBiZSBoYW5kbGVkIHNlcGVyYXRlbHkgCnRlc3RfZnJlcShldmVudHNbMjpsZW5ndGgoZXZlbnRzKV0pCmBgYAoKIyMjIyMgdGVzdGluZyBodXJyaWNhbmVzIG1hbnVhbGx5CmBgYHtyfQpldmVudCA8LSAiSHVycmljYW5lIgoKZWFybHkkaHVycmljYW5lX2ZyZXEgPC0gZ3JlcGwoZXZlbnQsIGVhcmx5JEVWRU5UX1RZUEUpCmxhdGUkaHVycmljYW5lX2ZyZXEgPC0gZ3JlcGwoZXZlbnQsIGxhdGUkRVZFTlRfVFlQRSkKCmZfZWFybHkgPC0gYWdncmVnYXRlKGh1cnJpY2FuZV9mcmVxIH4gQkVHSU5fWUVBUk1PTlRILCBGVU49c3VtLCBlYXJseSkKZl9sYXRlIDwtIGFnZ3JlZ2F0ZShodXJyaWNhbmVfZnJlcSB+IEJFR0lOX1lFQVJNT05USCwgRlVOPXN1bSwgbGF0ZSkKCgp0LnRlc3QoZl9lYXJseSRodXJyaWNhbmVfZnJlcSwgZl9sYXRlJGh1cnJpY2FuZV9mcmVxKQpgYGAKCiMjIyMjIFRoaXMgY29kZSBpcyBsb29raW5nIGF0IHRoZSB0aHJlZSB0eXBlcyBvZiBldmVudHMgd2UgaGF2ZSBjb25zaXN0ZW50bHkgcmVjb3JkZWQgdGhyb3VnaG91dCB0aGUgNzAgeWVhcnM6IEhhaWwsIFRodW5kZXJzdG9ybSBXaW5kLCBhbmQgVG9ybmFkb2VzLiBUaGUgZnJlcXVlbmN5IG9mIHRoZXNlIGV2ZW50cyBpbmNyZWFzZSBzaWduaWZpY2FudGx5IGluIHRoZSBsYXRlciBzZXQgb2YgeWVhcnMgZnJvbSAxOTg2LTIwMTkgYnV0IHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGJldHRlciBvciBtb3JlIGNvbnNpc3RlbnQgcmVjb3JkaW5nIHByYWN0aWNlcyBieSBOT0FBIGFzIG9wcG9zZWQgdG8gdGhlc2Ugc3Rvcm1zIGFjdHVhbGx5IGJlaW5nIHRoYXQgbXVjaCBtb3JlIGZyZXF1ZW50LiAKYGBge3J9CnlyczEgPC0gMTk1MDoxOTg1CnlyczIgPC0gMTk4NjoyMDE5CgplYXJseSA8LSBmdWxsW2Z1bGwkWUVBUiAlaW4lIHlyczEsXQpsYXRlIDwtIGZ1bGxbZnVsbCRZRUFSICVpbiUgeXJzMixdCgplYXJseSAlPiUgY291bnQoRVZFTlRfVFlQRSkKbCA8LSBsYXRlICU+JSBjb3VudChFVkVOVF9UWVBFKQpsW2wkRVZFTlRfVFlQRSAlaW4lIGMoIkhhaWwiLCAiVGh1bmRlcnN0b3JtIFdpbmQiLCAiVG9ybmFkbyIpLF0KYGBgCgoqKioKIyMjIyMjIFtiYWNrIHRvIG5hdmlnYXRpb25dKCNuYXYpCiMgPGEgbmFtZT0idGltZWFuYWwiPjwvYT4KIyBUaW1lIFNlcmllcyBBbmFseXNpcyAKYGBge3J9CgojIyMgYW5pbWF0ZWQgdGltZXMgc2VyaWVzIGdyYXBoIG92ZXIgeWVhcnMKeWVhciA8LSBhcy5udW1lcmljKHN1YnN0cihmdWxsJEJFR0lOX1lFQVJNT05USCwgMSwgNCkpCmhlYWQoeWVhcikKdGFibGUoeWVhcikgICAgICAgICAjICBkYXRhIGluY2x1ZGVzIHJlY29yZHMgZnJvbSAxOTUwIC0gMjAxOQoKbWF4KHllYXIpIC0gbWluKHllYXIpICAjIGVxdWFscyA2OSwgdGhhdCdzIGdvb2QhCgpmdWxsJHllYXIgPC0geWVhcgp0aW1lc3MgPC0gZnVsbCAlPiUgY291bnQoeWVhcikgICMgbWF0Y2hlcyB0aGUgdmFsdWVzIGZyb20gdGFibGUgZnVuY3Rpb24gKGxpbmUgNDUpCnBsb3QodGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9ICdUaW1lIHNlcmllcyBmb3IgYWxsIGV2ZW50IHR5cGVzIGZyb20gMTk1MC0yMDE5JykKCmdpdmVtZWRmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoeWVhcikpCmdpdmVtZWRmJHllYXIgPC0gYXMuaW50ZWdlcihhcy5udW1lcmljKGxldmVscyhnaXZlbWVkZiR5ZWFyKSlbZ2l2ZW1lZGYkeWVhcl0pCiNnaXZlbWVkZiR5ZWFyIDwtIGFzLkRhdGUoYXMuY2hhcmFjdGVyKGdpdmVtZWRmJHllYXIpLCAiJVkiKQoKZ2dwbG90KGdpdmVtZWRmLCBhZXMoeWVhciwgRnJlcSkpICsgICAgICAgICAgICAgIyBhbmltYXRlZCB0aW1lIHNlcmllcyBwbG90IGZvciBhbGwgZXZlbnQgdHlwZXMKICBnZW9tX2xpbmUoKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICB0cmFuc2l0aW9uX3JldmVhbCh5ZWFyKSArIAogIGxhYnModGl0bGUgPSAiWWVhcjoge2ZyYW1lX2Fsb25nfSIsIHggPSAneWVhcicsIHkgPSAnbnVtYmVyIG9mIHJlY29yZHMnKSAjKwogICNhbmltX3NhdmUoJ2FsbF9ldmVudF9uZXcuZ2lmJykgICAgICAgICAgICAgIyBDb21tZW50IHRoaXMgbGluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzYXZlIGl0IGFzIGEgZ2lmIGxvY2FsbHkKCmZhbmN5IDwtIGFzLmRhdGEuZnJhbWUoaGVhZChzb3J0KHRhYmxlKGZ1bGwkRVZFTlRfVFlQRSlbdGFibGUoZnVsbCRFVkVOVF9UWVBFKSA+IDEwMDAwXSxkZWNyZWFzaW5nID0gVCksOSkpCmNvbG5hbWVzKGZhbmN5KVsxXSA8LSAiZXZlbnRfdHlwZSIKZmFuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb3AgOSBldmVudCB0eXBlcyB3aXRoIG1vc3QgcmVjb3JkcwpmbGFnIDwtIGZhbmN5WywxXQpmdWxsZmxhZyA8LSBmdWxsW2Z1bGwkRVZFTlRfVFlQRT09ZmxhZyxdCnRhYmxlKGZ1bGxmbGFnJEVWRU5UX1RZUEUsZnVsbGZsYWckeWVhcikgICAgICAjIDYgZXZlbnQgdHlwZXMgd2l0aCAwIHJlY29yZHMgdW50aWwgMTk5NSAoRHJvdWdodCwgRmxhc2ggRmxvb2QsIEhTLCBIVywgV1MsIFdXKQoKZ2l2ZW1lZGYyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZnVsbGZsYWckRVZFTlRfVFlQRSxmdWxsZmxhZyR5ZWFyKSkKZ2l2ZW1lZGYyJFZhcjIgPC0gYXMuaW50ZWdlcihhcy5udW1lcmljKGxldmVscyhnaXZlbWVkZjIkVmFyMikpW2dpdmVtZWRmMiRWYXIyXSkKI2dpdmVtZWRmMiRWYXIyIDwtIGFzLkRhdGUoYXMuY2hhcmFjdGVyKGdpdmVtZWRmMiRWYXIyKSwgIiVZIikKCmdncGxvdChnaXZlbWVkZjIsIGFlcyhWYXIyLCBGcmVxLCBncm91cD1WYXIxKSkgKyAgICAgICAgICAgICAgIyBhbmltYXRlZCB0aW1lIHNlcmllcyBwbG90IGZvciB0b3AgOSBldmVudCB0eXBlcyB3aXRoIG1vc3QgcmVjb3JkcwogIGdlb21fbGluZShhZXMoY29sID0gVmFyMSksIHNpemUgPSAxKSArCiAgc2NhbGVfY29sb3VyX2Rpc2NyZXRlKCJldmVudCB0eXBlIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICB0cmFuc2l0aW9uX3JldmVhbChWYXIyKSArIAogIGxhYnModGl0bGUgPSAiWWVhcjoge2ZyYW1lX2Fsb25nfSIsIHggPSAneWVhcicsIHkgPSAnbnVtYmVyIG9mIHJlY29yZHMnKSAjKwogICNhbmltX3NhdmUoJ3RvcDlfbmV3LmdpZicpICAgICAgICMgQ29tbWVudCB0aGlzIGxpbmUgaWYgeW91IGRvbid0IHdhbnQgdG8gc2F2ZSBpdCBhcyBhIGdpZiBsb2NhbGx5CgojIyMgc2V2ZXJlIHdlYXRoZXIgaW4gQ29sb3JhZG8gcHJlZGljdGl2ZSBtb2RlbApmdWxsMiA8LSBmdWxsWyhmdWxsJFNUQVRFPT0nQ09MT1JBRE8nKSAmIChmdWxsJHllYXIgIT0gMjAxOSksXSAgICAgIyBzdWJzZXQgYWxsIENvbG9yYWRvIHJlY29yZHMgJiBnZXQgcmlkIG9mIDIwMTkgKHNpbmNlIG5vIHllYXItbG9uZyBkYXRhKQpmYW5jeSA8LSBhcy5kYXRhLmZyYW1lKGhlYWQoc29ydCh0YWJsZShmdWxsMiRFVkVOVF9UWVBFKSxkZWNyZWFzaW5nID0gVCksOSkpICAgICAjIFRvcCA5IG1vc3QgaGFwcGVuZWQgc2V2ZXJlIHdlYXRoZXIgaW4gQ29sb3JhZG8KY29sbmFtZXMoZmFuY3kpWzFdIDwtICJldmVudF90eXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFpbCwgV2ludGVyIFN0b3JtLCBXaW50ZXIgV2VhdGhlciwgVGh1bmRlcnN0b3JtLi4uCmZhbmN5Cgp0aW1lc3MyIDwtIGZ1bGwyICU+JSBjb3VudCh5ZWFyKQpwbG90KHRpbWVzczIsIHlsYWIgPSAnbnVtYmVyIG9mIHJlY29yZHMnLCB0eXBlID0gJ2wnLCBtYWluID0gJ1RpbWUgc2VyaWVzIGZvciBhbGwgZXZlbnQgdHlwZXMgaGFwcGVuZWQgaW4gQ29sb3JhZG8gZnJvbSAxOTUwLTIwMTgnKSAgICAgIyBUaW1lIHNlcmllcyBwbG90IGZvciBhbGwgc2V2ZXJlIHdlYXRoZXIgdHlwZXMgaW4gQ29sb3JhZG8KCnBhcihtZnJvdyA9IGMoMywzKSkKYXJudW1iZXIgPC0gcmVwKE5BLCB0aW1lcz1ucm93KGZhbmN5KSkKcHJlZDE5IDwtIHJlcChOQSwgdGltZXM9bnJvdyhmYW5jeSkpCnByZWQyMCA8LSByZXAoTkEsIHRpbWVzPW5yb3coZmFuY3kpKQoKZm9yIChpIGluIDE6bnJvdyhmYW5jeSkpewogIGZ1bGxzdWIgPC0gZnVsbDJbZnVsbDIkRVZFTlRfVFlQRT09ZmFuY3lbaSwxXSxdCiAgbmV3dGltZXNzIDwtIGZ1bGxzdWIgJT4lIGNvdW50KHllYXIpCiAgbmV3dGltZXNzIDwtIGFzLmRhdGEuZnJhbWUobmV3dGltZXNzKQogIHBsb3QobmV3dGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9IHBhc3RlKGZhbmN5W2ksMV0pKQogIGFyMSA8LSBhcihuZXd0aW1lc3NbLDJdKQogIGFybnVtYmVyW2ldIDwtIGFyMSRvcmRlcgogIHByZWRSZSA8LSBwcmVkaWN0KGFyMSxuLmFoZWFkID0gMikKICBwcmVkMTlbaV0gPC0gcHJlZFJlJHByZWRbMV0KICBwcmVkMjBbaV0gPC0gcHJlZFJlJHByZWRbMl0KfQoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyBFeGFtcGxlIG9mIEhhaWwgKENvbG9yYWRvKQpwYXIobWZyb3cgPSBjKDEsMSkpCmZ1bGxzdWIgPC0gZnVsbDJbZnVsbDIkRVZFTlRfVFlQRT09ZmFuY3lbMSwxXSxdCm5ld3RpbWVzcyA8LSBmdWxsc3ViICU+JSBjb3VudCh5ZWFyKQpuZXd0aW1lc3MgPC0gYXMuZGF0YS5mcmFtZShuZXd0aW1lc3MpCnBsb3QobmV3dGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9IHBhc3RlKGZhbmN5WzEsMV0pKQoKcGFyKG1mcm93ID0gYygxLDIpKQphY2YobmV3dGltZXNzWywyXSkKcGFjZihuZXd0aW1lc3NbLDJdKQojIyBTaW5jZSBwYWNmIGRpc3BsYXlzIGEgc2hhcnAgY3V0b2ZmIGFuZCBhY2YgZGlzcGxheXMgYSBzbG93IGRlY2F5LCB0aGlzIHNlcmllcyBkaXNwbGF5cyBhbiAiYXIgc2lnbmF0dXJlIgojIyBieSByZWFkaW5nIGJvdGggcGFjZiBhbmQgYWNmLCB3ZSBhcmUgY29uZmlkZW50IHRvIHVzZSBhcigxNSkgbW9kZWwgc2luY2UgUEFDRiBjdXQgb2ZmIGlzIGF0IGxhZyAxNS4KCgojIyMjIyMjIyMjIyMjIyMjIyMjIyBFeGFtcGxlIG9mIERyb3VnaHQgKENvbG9yYWRvKQpwYXIobWZyb3cgPSBjKDEsMSkpCmZ1bGxzdWIgPC0gZnVsbDJbZnVsbDIkRVZFTlRfVFlQRT09ZmFuY3lbNiwxXSxdCm5ld3RpbWVzcyA8LSBmdWxsc3ViICU+JSBjb3VudCh5ZWFyKQpuZXd0aW1lc3MgPC0gYXMuZGF0YS5mcmFtZShuZXd0aW1lc3MpCnBsb3QobmV3dGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9IHBhc3RlKGZhbmN5WzYsMV0pKQoKcGFyKG1mcm93ID0gYygxLDIpKQphY2YobmV3dGltZXNzWywyXSkKcGFjZihuZXd0aW1lc3NbLDJdKQoKIyMgV2UgY2FuIHNlZSB0aGF0IGZvciBEcm91Z2h0LCB0aGVyZSBpcyBubyBzdHJvbmcgZ2VvbWV0cnkgZGVjYXkgcGF0dGVybiBmb3IgYm90aCBhY2YgYW5kIHBhY2YsIHNvIGl0J3Mgbm90IGEgZ29vZCBpZGVhCiMjIHRvIHVzZSBhciBmdW5jdGlvbiBvbiBEcm91Z2h0IChzaW1pbGFyIHNpdHVhdGlvbiBmb3IgSGlnaCBXaW5kLCBGbGFzaCBGbG9vZCkuIEl0J3MgYWxzbyBpbnRlcmVzdGluZyBmb3IgYXIgbW9kZWwgb2YgCiMjIHRoaXMgdHlwZSBvZiB3ZWF0aGVyLCB0aGUgYXV0b21hdGljYWxseSBzZWxlY3RlZCBvcmRlciB3aW5kb3cgaXMgMC4gQW5kIHRoZSAyMDE5IHByZWRpY3Rpb24gXiAyMDIwIHByZWRpY3Rpb24gYXJlIHRoZSBzYW1lLgoKYXJudW1iZXJfbmV3IDwtIGFybnVtYmVyCnByZWQxOV9uZXcgPC0gZmxvb3IocHJlZDE5KQpwcmVkMjBfbmV3IDwtIGZsb29yKHByZWQyMCkKZmFuY3l0eXBlIDwtIGFzLmNoYXJhY3RlcihmYW5jeVssMV0pCgpnaXZlbWV0YWJsZSA8LSBjYmluZChmYW5jeXR5cGUsIGFybnVtYmVyX25ldywgcHJlZDE5X25ldywgcHJlZDIwX25ldykKY29sbmFtZXMoZ2l2ZW1ldGFibGUpWzFdIDwtICJFdmVudCBUeXBlIgpjb2xuYW1lcyhnaXZlbWV0YWJsZSlbMl0gPC0gIkxhZyBXaW5kb3ciCmNvbG5hbWVzKGdpdmVtZXRhYmxlKVszXSA8LSAiMjAxOSBQcmVkaWN0aW9uIgpjb2xuYW1lcyhnaXZlbWV0YWJsZSlbNF0gPC0gIjIwMjAgUHJlZGljdGlvbiIKeHRhYmxlKGdpdmVtZXRhYmxlKQoKYGBgCgoqKioKIyMjIyMjIFtiYWNrIHRvIG5hdmlnYXRpb25dKCNuYXYpCiMgPGEgbmFtZT0icHJlZGljdCI+PC9hPgojIFByZWRpY3RpdmUgTW9kZWxsaW5nCmBgYHtyfQojIyMgc2V2ZXJlIHdlYXRoZXIgaW4gQ29sb3JhZG8gcHJlZGljdGl2ZSBtb2RlbApmdWxsMiA8LSBmdWxsWyhmdWxsJFNUQVRFPT0nQ09MT1JBRE8nKSAmIChmdWxsJHllYXIgIT0gMjAxOSksXSAgICAgIyBzdWJzZXQgYWxsIENvbG9yYWRvIHJlY29yZHMgJiBnZXQgcmlkIG9mIDIwMTkgKHNpbmNlIG5vIHllYXItbG9uZyBkYXRhKQpmYW5jeSA8LSBhcy5kYXRhLmZyYW1lKGhlYWQoc29ydCh0YWJsZShmdWxsMiRFVkVOVF9UWVBFKSxkZWNyZWFzaW5nID0gVCksOSkpICAgICAjIFRvcCA5IG1vc3QgaGFwcGVuZWQgc2V2ZXJlIHdlYXRoZXIgaW4gQ29sb3JhZG8KY29sbmFtZXMoZmFuY3kpWzFdIDwtICJldmVudF90eXBlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSGFpbCwgV2ludGVyIFN0b3JtLCBXaW50ZXIgV2VhdGhlciwgVGh1bmRlcnN0b3JtLi4uCmZhbmN5Cgp0aW1lc3MyIDwtIGZ1bGwyICU+JSBjb3VudCh5ZWFyKQpwbG90KHRpbWVzczIsIHlsYWIgPSAnbnVtYmVyIG9mIHJlY29yZHMnLCB0eXBlID0gJ2wnLCBtYWluID0gJ1RpbWUgc2VyaWVzIGZvciBhbGwgZXZlbnQgdHlwZXMgaGFwcGVuZWQgaW4gQ29sb3JhZG8gZnJvbSAxOTUwLTIwMTgnKSAgICAgIyBUaW1lIHNlcmllcyBwbG90IGZvciBhbGwgc2V2ZXJlIHdlYXRoZXIgdHlwZXMgaW4gQ29sb3JhZG8KCnBhcihtZnJvdyA9IGMoMywzKSkKYXJudW1iZXIgPC0gcmVwKE5BLCB0aW1lcz1ucm93KGZhbmN5KSkKcHJlZDE5IDwtIHJlcChOQSwgdGltZXM9bnJvdyhmYW5jeSkpCnByZWQyMCA8LSByZXAoTkEsIHRpbWVzPW5yb3coZmFuY3kpKQoKZm9yIChpIGluIDE6bnJvdyhmYW5jeSkpewogIGZ1bGxzdWIgPC0gZnVsbDJbZnVsbDIkRVZFTlRfVFlQRT09ZmFuY3lbaSwxXSxdCiAgbmV3dGltZXNzIDwtIGZ1bGxzdWIgJT4lIGNvdW50KHllYXIpCiAgbmV3dGltZXNzIDwtIGFzLmRhdGEuZnJhbWUobmV3dGltZXNzKQogIHBsb3QobmV3dGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9IHBhc3RlKGZhbmN5W2ksMV0pKQogIGFyMSA8LSBhcihuZXd0aW1lc3NbLDJdKQogIGFybnVtYmVyW2ldIDwtIGFyMSRvcmRlcgogIHByZWRSZSA8LSBwcmVkaWN0KGFyMSxuLmFoZWFkID0gMikKICBwcmVkMTlbaV0gPC0gcHJlZFJlJHByZWRbMV0KICBwcmVkMjBbaV0gPC0gcHJlZFJlJHByZWRbMl0KfQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyBFeGFtcGxlIG9mIEhhaWwgKENvbG9yYWRvKQpwYXIobWZyb3cgPSBjKDEsMSkpCmZ1bGxzdWIgPC0gZnVsbDJbZnVsbDIkRVZFTlRfVFlQRT09ZmFuY3lbMSwxXSxdCm5ld3RpbWVzcyA8LSBmdWxsc3ViICU+JSBjb3VudCh5ZWFyKQpuZXd0aW1lc3MgPC0gYXMuZGF0YS5mcmFtZShuZXd0aW1lc3MpCnBsb3QobmV3dGltZXNzLCB5bGFiID0gJ251bWJlciBvZiByZWNvcmRzJywgdHlwZSA9ICdsJywgbWFpbiA9IHBhc3RlKGZhbmN5WzEsMV0pKQoKcGFyKG1mcm93ID0gYygxLDIpKQphY2YobmV3dGltZXNzWywyXSkKcGFjZihuZXd0aW1lc3NbLDJdKQojIyBTaW5jZSBwYWNmIGRpc3BsYXlzIGEgc2hhcnAgY3V0b2ZmIGFuZCBhY2YgZGlzcGxheXMgYSBzbG93IGRlY2F5LCB0aGlzIHNlcmllcyBkaXNwbGF5cyBhbiAiYXIgc2lnbmF0dXJlIgojIyBieSByZWFkaW5nIGJvdGggcGFjZiBhbmQgYWNmLCB3ZSBhcmUgY29uZmlkZW50IHRvIHVzZSBhcigxNSkgbW9kZWwgc2luY2UgUEFDRiBjdXQgb2ZmIGlzIGF0IGxhZyAxNS4KYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMgRXhhbXBsZSBvZiBEcm91Z2h0IChDb2xvcmFkbykKcGFyKG1mcm93ID0gYygxLDEpKQpmdWxsc3ViIDwtIGZ1bGwyW2Z1bGwyJEVWRU5UX1RZUEU9PWZhbmN5WzYsMV0sXQpuZXd0aW1lc3MgPC0gZnVsbHN1YiAlPiUgY291bnQoeWVhcikKbmV3dGltZXNzIDwtIGFzLmRhdGEuZnJhbWUobmV3dGltZXNzKQpwbG90KG5ld3RpbWVzcywgeWxhYiA9ICdudW1iZXIgb2YgcmVjb3JkcycsIHR5cGUgPSAnbCcsIG1haW4gPSBwYXN0ZShmYW5jeVs2LDFdKSkKCnBhcihtZnJvdyA9IGMoMSwyKSkKYWNmKG5ld3RpbWVzc1ssMl0pCnBhY2YobmV3dGltZXNzWywyXSkKCiMjIFdlIGNhbiBzZWUgdGhhdCBmb3IgRHJvdWdodCwgdGhlcmUgaXMgbm8gc3Ryb25nIGdlb21ldHJ5IGRlY2F5IHBhdHRlcm4gZm9yIGJvdGggYWNmIGFuZCBwYWNmLCBzbyBpdCdzIG5vdCBhIGdvb2QgaWRlYQojIyB0byB1c2UgYXIgZnVuY3Rpb24gb24gRHJvdWdodCAoc2ltaWxhciBzaXR1YXRpb24gZm9yIEhpZ2ggV2luZCwgRmxhc2ggRmxvb2QpLiBJdCdzIGFsc28gaW50ZXJlc3RpbmcgZm9yIGFyIG1vZGVsIG9mIAojIyB0aGlzIHR5cGUgb2Ygd2VhdGhlciwgdGhlIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb3JkZXIgd2luZG93IGlzIDAuIEFuZCB0aGUgMjAxOSBwcmVkaWN0aW9uIF4gMjAyMCBwcmVkaWN0aW9uIGFyZSB0aGUgc2FtZS4KYGBgCgpgYGB7cn0KYXJudW1iZXJfbmV3IDwtIGFybnVtYmVyCnByZWQxOV9uZXcgPC0gZmxvb3IocHJlZDE5KQpwcmVkMjBfbmV3IDwtIGZsb29yKHByZWQyMCkKZmFuY3l0eXBlIDwtIGFzLmNoYXJhY3RlcihmYW5jeVssMV0pCgpnaXZlbWV0YWJsZSA8LSBjYmluZChmYW5jeXR5cGUsIGFybnVtYmVyX25ldywgcHJlZDE5X25ldywgcHJlZDIwX25ldykKY29sbmFtZXMoZ2l2ZW1ldGFibGUpWzFdIDwtICJFdmVudCBUeXBlIgpjb2xuYW1lcyhnaXZlbWV0YWJsZSlbMl0gPC0gIkxhZyBXaW5kb3ciCmNvbG5hbWVzKGdpdmVtZXRhYmxlKVszXSA8LSAiMjAxOSBQcmVkaWN0aW9uIgpjb2xuYW1lcyhnaXZlbWV0YWJsZSlbNF0gPC0gIjIwMjAgUHJlZGljdGlvbiIKeHRhYmxlKGdpdmVtZXRhYmxlKQpgYGAKCgoqKioKIyA8YSBuYW1lPSJjc3YiPjwvYT4KIyMjIyMjIFtiYWNrIHRvIG5hdmlnYXRpb25dKCNuYXYpCiMgQ3JlYXRpbmcgdGhlIGZ1bGxXZWF0aGVyLmNzdiBmaWxlIGZyb20gdGhlIGRvd25sb2FkZWQgTk9BQSBmaWxlcwojIyMgUmVuYW1lIGZpbGVzIGluIGRldGFpbHMgZm9sZGVyIHRvIGFsbG93IGZvciBiaW5kaW5nIG9mIGRhdGEgKG9ubHkgbmVlZGVkIHRvIGJlIHBlcmZvcm1lZCBvbmNlKQpgYGB7cn0KIyBvZ2ZpbGVzIDwtIGxpc3QuZmlsZXMoIn4vRG9jdW1lbnRzL0NVIEJvdWxkZXIvMk1hc3RlcnMvMkZhbGwgU2VtZXN0ZXIvMy1RdWFudGl0YXRpdmUtTWV0aG9kcy9wcm9qZWN0L2RhdGEvZGV0YWlscyIpCiMgbmV3ZmlsZXMgPC0gZ3N1YigiX2NcXGR7OH0uY3N2Lmd6IiwgJy5jc3YnLCBvZ2ZpbGVzKQojIGZpbGUucmVuYW1lKG9nZmlsZXMsIG5ld2ZpbGVzKQpgYGAKCiMjIyBCaW5kIGZpbGVzIGZyb20gZXZlcnkgeWVhciB0b2dldGhlciBpbnRvIGRhdGFmcmFtZSBsYWJlbGxlZCAiZnVsbCIgKDcwIHllYXJzIHdvcnRoIG9mIGRhdGEhKSB0aGVuIGV4cG9ydCB0byBjc3YgZmlsZSBmb3IgZWFzZSBvZiB1c2UgYW5kIHNoYXJpbmcgcHVycG9zZXMgKG9ubHkgbmVlZGVkIHRvIGJlIHBlcmZvcm1lZCBvbmNlKQpgYGB7cn0KIyB5ZWFyc2VxIDwtIDE5NTA6MjAxOQojIGZ1bGwgPC0gcmVhZC5jc3YoJ2RhdGEvZGV0YWlscy9TdG9ybUV2ZW50c19kZXRhaWxzLWZ0cF92MS4wX2QxOTUwLmNzdicpCiMgCiMgCiMgZm9yKGkgaW4gMjpsZW5ndGgoeWVhcnNlcSkpewojICAgICBmcGN1ciA8LSBwYXN0ZSgnZGF0YS9kZXRhaWxzL1N0b3JtRXZlbnRzX2RldGFpbHMtZnRwX3YxLjBfZCcsIHllYXJzZXFbaV0sICcuY3N2Jywgc2VwID0gIiIpCiMgICAgIGN1ciA8LSByZWFkLmNzdihmcGN1cikKIyAgICAgZnVsbCA8LSByYmluZChmdWxsLCBjdXIpCiMgfQojIGZ1bGwgPC0gYXMuZGF0YS5mcmFtZShmdWxsKQojIAojICAgbWFraW5nIHN1cmUgYWxsIHRoZSBkYXRhIHdhcyBjb21iaW5lZCBjb3JyZWN0bHkgCiMgc3VtbWFyeShmdWxsJFlFQVIpCiMgdW5pcXVlKGZ1bGwkWUVBUikKIyBoZWFkKGZ1bGwpCiMgdW5pcXVlKGZ1bGwkU1RBVEUpCiMgc3Vic2V0KGZ1bGwsIFNUQVRFID09ICIiKSAgICAgICAgICAgICAgICAgICAgKioqKip0aGVyZSBpcyBvbmUgZW50cnkgd2l0aCBubyBzdGF0ZSoqKioqCiMgCiMgd3JpdGUuY3N2KGZ1bGwsIGZpbGUgPSAid2VhdGhlckZ1bGwuY3N2IikKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=